2010-08-20 41 views
3

有沒有辦法強制Mysql從PHP殺死一個查詢,如果它沒有在特定時間範圍內返回?從PHP的MysqlQuery強制超時

我有時會看到運行數小時的昂貴查詢(顯然這時HTTP連接超時或用戶離開了)。一旦足夠多的查詢累積起來,就會嚴重影響整體性能。

+2

哇,從來沒有見過的查詢運行了幾個小時... – jolt 2010-08-20 23:51:23

回答

4

長時間運行的查詢是設計不佳的標誌。最好檢查有問題的查詢以及它們如何進行優化。這隻會忽略問題。

如果仍然希望這樣,您可以使用SHOW PROCESSESLIST命令來獲取所有正在運行的進程。然後使用KILL x來終止客戶端連接。但是爲了這個工作,你必須從另一個PHP腳本檢查這個,因爲多線程還不可能。也不建議讓PHP用戶使用的用戶弄亂服務器設置。

+0

我正在考慮設置一些連接屬性的線。我不是非常喜歡SHOW PROCESSLIST和KILL。我希望有更好的東西 – Ghostrider 2010-08-21 00:00:18

1

警告:預期的行爲現在應該用於像upstart之類的東西。

你想爲這種事情創建DAEMONS,但你也可以使用cron。
只需要查看xyz time以上查詢的設置間隔並殺死它們即可。

// this instruction kills all processes executing for more than 10 seconds 
SELECT CONCAT('KILL ',id,';') 
FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE state = "executing" AND `time` >= 10 

然而,如果查詢是這樣運行了很長時間...... 他們必須優化

另一方面,您可能試圖管理共享服務器,可能會有一些流氓用戶。在這種情況下,您應該在服務條款中指定腳本將被監視和禁用,這正是應該對這樣的冒犯者做的事情。