2010-03-22 53 views
2

我有一個需要很長時間才能運行的PHP進程。我不想讓調用它的AJAX進程等待它完成。當PHP進程完成時,它將在數據庫中設置一個字段。應該有某種AJAX輪詢呼叫定期檢查數據庫字段並設置消息。ajax:不要等待響應,但要定期檢查

如何設置jQuery AJAX調用來輪詢而不是等待? PHP腳本是否需要做特別的事情?

回答

2

讓服務器端動作更容易,直到數值準備就緒,然後設置客戶端重複輪詢(使用setTimeout())直到收到正面響應或固定觀察到失敗的次數。

var timer; 
var count = 0; 
function poll(url) { 
     timer = setTimeout(function() { 
      $.ajax({ 
       url: url, 
       success: function(data) { 
        if (data.Status) { 
         ...do something... 
        } 
        else { 
        if (++count > 10) { 
         ...failure action... 
        } 
        else { 
         poll(url); 
        } 
        } 
       ...other options... 
      }) 
     },5000) 
} 

然後在服務器端使用的東西做(僞)...

if operation is not complete 
    return serialize({ Status : false }) 
else 
    data = .... 
    data.Status = true 
    return serialize(data) 
end 
0

一個快速的解決方法是創建另一個PHP腳本,你可以調用將檢查以來,直接通過AJAX的comm方法訪問數據庫不是一個好的做法。

  1. 創建一個PHP文件,並且需要進行數據庫檢查。
  2. 讓它能發佈'T'或'F'之類的東西
  3. 創建一個SetInterval('yourfunctionname',100),這樣你就可以調用輪詢腳本。
  4. 如果該輪詢的答案是'T',請調用您的其他長時間腳本。
2

第1步:第一次調用長時間運行的進程 - 設置ignore_user_abort(true);在需要很長時間並關閉連接的PHP腳本中。

步驟2:檢查是否使用建議的方法更新DB字段。

+0

@stackoverflow:在第1步中,我該如何關閉連接?我曾想過發送一個202(接受)的頭文件,但通常用'exit()'結束,這會終止腳本。 – dnagirl 2010-03-22 19:51:31

+0

http://www.php.net/manual/en/features.connection-handling.php#71172可能有幫助。 – stackoverflow 2010-03-22 20:48:47