2013-05-29 47 views
11

我目前正在與一個巨大的數據庫的CRM系統工作。 如果用戶想要搜索客戶,他可以使用ajax搜索。每次他在搜索字段中改變某些內容時,在呼叫處於掛起狀態時,舊的呼叫被取消,並且新的呼叫將被髮送到服務器。 我的問題是,服務器端的php進程繼續運行。因此,如果用戶開始輸入地址,則會啓動並取消多個請求,並且服務器需要越來越多的時間來回答。如何取消ajax調用取消時的PHP進程?

當ajax調用取消時,是否可以取消正在運行的php進程? 或者在服務器端有沒有可能的解決方案,以檢測來自同一用戶的搜索請求是否正在運行並在開始新請求之前取消它?

在此先感謝您的答案。

+1

你可以限制一個數字字符需要充分在搜索框中或當搜索框和類型時,你用jQuery ajax搜索它。 – Rafee

+1

如果只有用戶點擊「搜索」按鈕或點擊回車鍵,您應該開始搜索。 –

+3

如果您的搜索查找過程花費很長時間纔會導致進程在運行多次時滯後服務器,那麼您需要優化搜索例程,而不是試圖終止正在運行的進程。把一個鍵放在搜索列上,它應該花費幾分之一秒來獲取結果 – Anigel

回答

0

我現在想出了一個解決方案。

您可以設置一個布爾isPending當Ajax請求被髮送,你可以將該值設置爲true

AJAX調用回調函數(成功或錯誤),你可以設置isPending爲假之後;

此外,您可以有一個字符串變量searchContent並更改文本時更改該變量。所以當Ajax Call沒有掛起,並且searchContent有內容時,你可以發送另一個Ajax呼叫。

最好的選擇是使用已經編寫的解決方案,例如:http://jqueryui.com/autocomplete/它非常簡單,它的工作得很好,它甚至已經構建在緩存系統中。

+0

那麼這不會解決我的問題,因爲它也向服務器發送多個請求。因此,當新數據被註冊但服務器進程繼續運行直到服務器被配置不這樣做時,它取消ajax請求。 –

3

你的服務器端PHP必須輸出一些東西來檢測請求被取消。但是,由於您可能執行冗長的SQL查詢,因此無法輸出任何內容。

但你仍然可以保存您的連接ID到會話,並殺死連接,如果它檢測到:

  1. 公開會議
  2. 打開SQL連接
  3. 如果search_connection_id在會話設置,殺連接
  4. 查找您的連接ID,保存在會話中作爲search_connection_id
  5. 關閉會話 - 重要的,否則下一個請求將在步驟1中被阻止
  6. 查詢數據庫
  7. 如果連接斷開,它的另一個搜索打死你在步驟3,出口
  8. 公開會議,刪除search_connection_id
  9. 發送響應,關閉SQL連接
1

謝謝大家對你的答案。

我重新設計了我的搜索查詢,如Anigel建議的,結果令人沮喪。

但我認爲我的問題的正確答案是馬立克和哈里克里什南Viswanathar的答案。兩者都應該做我所要求的。