2010-07-28 94 views
0

我正在構建一個Web應用程序,允許用戶針對兩個數據庫之一運行查詢。它們一次只允許向每個數據庫提交一個查詢。目前,我設置$ _SESSION ['runningAdvancedQuery'](例如)讓我知道他們是否正在運行查詢。這是爲了防止某人打開第二個瀏覽器選項卡並再次點擊該資源。它的工作原理只是......在PHP中的瀏覽器選項卡之間維護狀態

巨大的,如果我開始在選項卡中的查詢,然後關閉該選項卡完成之前,該標誌沒有得到取消設置。因此,如果我重新打開該頁面,我無法運行任何查詢,因爲它認爲我仍然有一個正在運行。任何人都有解決這個問題的建議?

+0

你何時清除$ _SESSION ['runningAdvancedQuery']? – ankitjaininfo 2010-07-28 19:53:36

+0

AJAX調用來自瀏覽器以啓動查詢。完成後,另一個AJAX調用將檢索並顯示結果。顯示結果後,標誌未設置。 – Derek 2010-07-28 19:56:03

+0

你在線程中運行查詢嗎?或者仍然有待處理的Ajax呼叫。 – ankitjaininfo 2010-07-28 20:01:14

回答

1

將此值不是例如1,但UNIX時間戳,也由去年comprasion查詢時間戳檢查到現在爲止,設置了一些時間差必須去通過執行一個查詢。記住將塊時間設置爲安全值 - 可以執行最長的查詢時間。如果用戶關閉了他的標籤,短時間後他將被「解鎖」。

+0

這可以工作,但我可以看到客戶抱怨不得不等待。而且,查詢時間高度可變。 – Derek 2010-07-28 20:24:30

+0

也許嘗試檢測關閉標籤: http://www.php.net/manual/en/features.connection-handling.php – 2010-07-28 20:41:43

+0

這是超過實際的答案評論。您提供的鏈接引導我學習到: 「下次您的腳本嘗試輸出某些內容時,PHP將檢測到連接已中止,並且關閉功能被調用」 在關閉功能中執行操作似乎可以我需要什麼(特別是因爲腳本不會終止,直到查詢結束) – Derek 2010-07-28 21:36:24

1
<?php 
ignore_user_abort(true); 

//if session variable is not set 
    //set session variable 
    //run query 
    //unset session variable 
//else 
    //show error: "your other query isn't finished yet" 

?> 
1

而不是設置$_SESSION['runningAdvancedQuery'];爲true,您可以將其設置爲SELECT CONNECTION_ID();輸出,並檢查show processlist;是否仍在運行。儘管如此,這將成爲其他答案的插件:特別是在使用持久連接時,其他進程可以使用connection_id。

相同的用戶,你總是被允許看你自己的過程。因此,在其他檢查相結合:

  1. 商店時間戳,CONNECTION_ID &實際的SQL查詢(我會刪除所有空白&投給上或下的字符串,以避免在呈現輕微差異無關緊要)。
  2. 當然使用ignore_user_abort()功能,查詢前做一個session_write_close(),重新啓動會話&將其設置爲查詢後完成。
  3. 檢查運行的查詢,檢查是否
    • connection-id仍然存在。
    • 查詢運行的時間戳+秒相當接近當前時間。
    • 查詢(小寫,剝離空白)大約是相同的查詢的要求(使用SHOW FULL PROCESSLIST;得到整個查詢)。

可選,走了一步,給人民的可能性KILL QUERY <connection_id>;(僅在前3個檢查所有產生了積極的)。

相關問題