2011-03-30 82 views
2

我在工作中運行統計信息服務器,由於運行的查詢量有時會變慢。退出PHP腳本後終止或停止MySQL查詢

我們的營銷團隊將其作爲主要統計工具。團隊中的某些人有時會在結束之前退出腳本(通過關閉瀏覽器或標籤)。同時,SQL查詢繼續執行。

當某人關閉或離開此腳本時,如何終止或停止PHP腳本的關聯查詢?

我們當然不希望手工殺死這些查詢(我們已經這樣做),但只要該用戶退出腳本就自動執行。

我們的大部分統計腳本都是基於每天晚上對其中最重的人進行的預先計算,而這些對我們來說並不成問題。對於其他人,我們還沒有實施預先計算,我們希望能夠在執行之前殺死孤兒查詢。

+0

檢查該問題和答案:http://stackoverflow.com/questions/1189039/how-do-i-routinely-kill-mysql-queries-that-have-been-alive-for-too-tolong – 2011-03-30 13:20:18

+0

也許更好地指示SQL查詢的進度將會使人們不再像以前那樣放棄網頁。另一種選擇是使SQL查詢異步,所以人們不必等待結果。 – 2011-03-30 13:22:24

+0

感謝您的建議。然而,我們運行的大多數腳本都有一個龐大的查詢parsng,通過10或2000萬行。所以沒有真正的方法知道查詢的n%已經達到我猜。 – cellover 2011-03-30 13:26:57

回答

1

您可以使用Connection Handling mechanisms檢查從瀏覽器到服務器的連接是否仍處於打開狀態,並進行適當的反應。

然而要注意的是有開始至今將運行完所有的SQL查詢 - 如果他們是複雜的,這可能需要一段時間,而且也沒有帶的方式來終止它們:你需要觀看哪個線程運行什麼並定期收穫廢棄的線程。

+0

這就是問題所在,一旦用戶退出他的頁面,我們希望觸發一個kill查詢。我想我們已經找到了一種方法來做到這一點: - 一旦連接建立,獲得SQL CONNECTION_ID()(http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_connection -id) - 它存儲在某個變量 - 一旦用戶退出網頁,發出觸發基於以前的變量 – cellover 2011-03-30 14:14:12

+0

@cellover一個KILL查詢一個js事件:發出JS事件時,他們關閉瀏覽器?祝你好運 - 大多數瀏覽器會殺'onunload'事件處理程序,如果他們跑太久... – Piskvor 2011-03-30 14:18:24

0

最好的方法(我認爲)是在使用後立即關閉連接。 也可以設置wait_timeout會話變量(例如減少到20秒);在這種情況下,連接將自動關閉。

+0

的問題是,一旦查詢已完成連接應該被關閉,有時從未happend ^^ – cellover 2011-03-30 13:52:43

+0

爲什麼你不能手動關閉它在你的PHP腳本?而關於wait_timeout變量 - 它強制服務器關閉連接,如果一段時間沒有激活。 – Devart 2011-03-30 14:17:37

+0

我們無法激活它,因爲我們不知道用戶將在什麼步驟退出腳本。至於wait_timeout變量,如果他等待結果顯示出來,即使這需要1個小時,我們也不想將用戶踢出去。 – cellover 2011-03-30 14:20:04

0

不幸的是,如果他們只是在他們的瀏覽器上點擊關閉按鈕,可以做的不多。列出的已經有一些內置函數會檢查會話。也許嘗試緩存最常用的查詢。 Google「緩存php mysql」。

如果這不起作用,您可以使用AJAX構建它,並且每次查詢完成時 - 服務器將發回一條消息,以便用戶更新其請求的進度。這可能會減少剛剛放棄會議的人數。

+0

是的,這可能會減少用戶過早退出腳本的數量,但它可以在運行大量查詢的腳本上工作,這在這裏很少見。我們通常在每個腳本中運行更多大約2或3個查詢。 – cellover 2011-03-30 13:53:47

0

隨着我的一些同事,我們提出了以下思路:

  • 一旦MySQL連接建立後,在SQL得到CONNECTION_ID() - CONNECTION_ID() doc on MySQL
  • 其存儲在某個變量
  • 一次用戶退出該頁面(可以通過退出或加載另一頁面),發出觸發基於前一個變量的KILL查詢的js事件

我們將我們會在接下來的幾個小時內進行測試,一旦我們確信它能夠正常工作,我會盡快更新。

+0

它工作?你以其他方式解決了嗎? – 2013-12-07 19:31:49

1

您有時需要能夠殺死持續時間過長的查詢。如果你想在你的操作系統中這樣做,你可以這樣做 - 這是相當安全的,因爲MySQL在子進程中運行所有這些。在Unix中,這是pskill

您也可以使用MysqlAdmin來做到這一點,它應該在不同的操作系統中基本相同。你正在運行的進程的列表:

$ mysqladmin processlist # password if necessary 
+----+------+-----------+----+---------+------+-------+------------------+ 
| Id | User | Host  | db | Command | Time | State | Info    | 
+----+------+-----------+----+---------+------+-------+------------------+ 
| 2 | root | localhost | | Query | 0 |  | show processlist | 
+----+------+-----------+----+---------+------+-------+------------------+ 

再看看mysqladmin kill將其刪除。

編輯

好吧,如果這是關於檢測瀏覽器關閉,我看到幾個方法:

  1. 退房PHP的connection handling。看起來您可以註冊一個在用戶關閉瀏覽器時調用的句柄。
  2. 如果處理程序不被調用,也許你可以調用插頁,說簡單地「運行的查詢......」,然後該網頁的呈現可以在一個循環中坐,等待查詢完成或連接結束。如果查詢完成,則重定向到「結果」頁面,如果連接斷開,請手動終止查詢(請參見上文)。
  3. 如果這些方法毫無結果,還有另一種選擇。瀏覽器在瀏覽器中提供了一個「在卸載」事件上的Javascript,該事件在瀏覽器中最近被觸發。一個快速的Ajax帖子可以解決長時間運行的查詢問題。

(作業:討論所有方法的優點和缺點)的這些

無罷工我美麗的,但也有一些工作,他們可以進行工作。說實話,當我們遇到這個問題時,我們只是保留了一個流程列表並殺掉了看起來像錯誤查詢的東西。

+0

感謝您的評論!是的,我們知道如何殺死查詢,我們只希望在用戶退出該頁面時自動終止它們,並且除非出於很好的理由,否則我們不希望殺死太久的查詢。 – cellover 2011-03-30 14:50:47

+0

增加了一些關於如何檢測用戶「退出頁面」的想法。 – ndp 2011-03-31 04:19:16