2012-07-11 113 views
1

後「MySQL服務器已經走了」我在設計來顯示/電子郵件用戶保存的搜索信息查詢2個表:用戶&的心願。幾分鐘

搜索信息包含書名以及其他內容。

我有第一個查詢,旨在把所有在wishlist表中有記錄的用戶放入數組中。

然後使用foreach循環,通過第二次查詢,取每本書的書名,並運行在不同的網站搜索並保存信息屏幕或電子郵件。

通過需要大約3分鐘,第一個用戶的信息,第一次運行進行組裝,然而,顯示此信息後,我看到了可怕的「MySQL服務器已經走了。」

根據http://dev.mysql.com/doc/refman/5.0/en/gone-away.html - 這不應該這麼快就發生了。

對於所述第二查詢的代碼很簡單:信息被編譯爲該用戶

SELECT * FROM wishlist WHERE uid = " . $sendtouser . " ORDER BY wishid 

後,我下面以關閉循環,並結束連接。

} while ($row_rsWishDetails = mysql_fetch_assoc($rsWishDetails)); 
mysql_free_result($rsWishDetails); 

我已經試過我已在網頁上,包括髮現了一些其他建議:

ini_set('max_execution_time', 22222); 
ini_set('mysql.connect_timeout', 500); 
ini_set('default_socket_timeout', 600); 

但沒有什麼是解決了這個問題。

任何想法?

非常感謝。

回答

1

對於長時間運行的腳本,您需要在運行任何查詢之前確保連接仍處於打開狀態。最好的方法是在查詢之前使用類似mysql_ping()的東西。

此外,mysql是相當陳舊,效率低下。您應該嘗試升級到mysqli

+0

感謝您的迴應:)但5分鐘真的「長時間運行」?事實上,查詢本身並不需要很長時間,事實上查詢必須暫停,而信息正在從網絡編譯之後才能繼續。我想在每個用戶的最後添加一個「睡眠(3)」,但它沒有做任何事情。 – Aethon 2012-07-11 01:23:18

+0

不幸的是,我們租用空間的服務器沒有安裝mysqli。 – Aethon 2012-07-11 01:50:26

+0

這使我平安。我什麼時候運行?查詢之前?這是否意味着在每個循環之前,ping會再次運行?或者它會在查詢開始之前運行一次ping? – Aethon 2012-07-11 01:51:36

0

您需要測試您可以接收多少數據。

你的數據庫機器是舊的或你的結果行數1000000000000000000000+, 您需要使用分頁解決您的查詢:極限,光標等...

它不是你的問題的直接解決方案。

首先,檢查你的一行

SELECT COUNT(*) FROM wishlist WHERE uid = " . $sendtouser . " 
  • 順序計數BY是沒有必要的。

檢查刪除ORDER BY短語,如果可以,重新安排與PHP代碼。有時它可能會有所幫助。

AND ...

ini_set('max_execution_time', 22222); 

它是客戶端(PHP)配置,如你所知,如果mysql服務器不允許,它是沒用的。

+0

我可以告訴你行數。目前只有3個用戶。對於心願表中記錄最多的用戶,行數小於15。 – Aethon 2012-07-11 01:49:39

+0

@Aethon 哎呀,至少,這不是查詢問題,但看起來網絡問題。 你可以在運行PHP的機器上檢查這個命令嗎? telnet mysql_server_host_ip 3306 如果花費很長時間,這是網絡問題。要麼...? – TaeL 2012-07-11 01:58:16

+0

感謝您的評論,但我認爲等待從網絡獲取結果的時間是導致問題的原因。我想知道wait_timeout可能會有幫助嗎? – Aethon 2012-07-11 02:00:05