我有一個需要很長時間才能運行的PHP進程。我不想讓調用它的AJAX進程等待它完成。當PHP進程完成時,它將在數據庫中設置一個字段。應該有某種AJAX輪詢呼叫定期檢查數據庫字段並設置消息。ajax:不要等待響應,但要定期檢查
如何設置jQuery AJAX調用來輪詢而不是等待? PHP腳本是否需要做特別的事情?
我有一個需要很長時間才能運行的PHP進程。我不想讓調用它的AJAX進程等待它完成。當PHP進程完成時,它將在數據庫中設置一個字段。應該有某種AJAX輪詢呼叫定期檢查數據庫字段並設置消息。ajax:不要等待響應,但要定期檢查
如何設置jQuery AJAX調用來輪詢而不是等待? PHP腳本是否需要做特別的事情?
讓服務器端動作更容易,直到數值準備就緒,然後設置客戶端重複輪詢(使用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
一個快速的解決方法是創建另一個PHP腳本,你可以調用將檢查以來,直接通過AJAX的comm方法訪問數據庫不是一個好的做法。
SetInterval('yourfunctionname',100)
,這樣你就可以調用輪詢腳本。你的意思是通常的輪詢(而不是長輪詢)?如果是的話,也許這有助於:http://jquery-howto.blogspot.com/2009/04/ajax-update-content-every-x-seconds.html
PHP腳本只會檢查數據庫字段,並立即返回true/false。
第1步:第一次調用長時間運行的進程 - 設置ignore_user_abort(true);在需要很長時間並關閉連接的PHP腳本中。
步驟2:檢查是否使用建議的方法更新DB字段。
@stackoverflow:在第1步中,我該如何關閉連接?我曾想過發送一個202(接受)的頭文件,但通常用'exit()'結束,這會終止腳本。 – dnagirl 2010-03-22 19:51:31
http://www.php.net/manual/en/features.connection-handling.php#71172可能有幫助。 – stackoverflow 2010-03-22 20:48:47