我希望這將是對您有用
首先,你需要在你的PHP腳本來禁用輸出緩衝
@apache_setenv('no-gzip', 1);
@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);
然後你需要在這個過程中迴應你從PHP中取得的進展,例如:
for($i=0;$i < 20;$i++){
echo ($i > 0 ? "#":"").($i/20*100);
sleep(1);
}
然後,在JavaScript中,您需要監聽xhr readystate change事件,並在發生這種情況時,只需解析響應文本並根據需要顯示進度。
監聽事件:
$.ajaxPrefilter(function(options, _, jqXHR) {
if (options.onreadystatechange) {
var xhrFactory = options.xhr;
options.xhr = function() {
var xhr = xhrFactory.apply(this, arguments);
function handler() {
options.onreadystatechange(xhr, jqXHR);
}
if (xhr.addEventListener) {
xhr.addEventListener("readystatechange", handler, false);
} else {
setTimeout(function() {
var internal = xhr.onreadystatechange;
if (internal) {
xhr.onreadystatechange = function() {
handler();
internal.apply(this, arguments);
};
}
}, 0);
}
return xhr;
};
}
});
和樣品AJAX請求的:
$.ajax({
url: "test.php",
cache: false,
onreadystatechange: function(xhr) {
res = xhr.responseText.split("#");
$("#id").html(res[res.length-1] + "% done<br/>");
}
}).done(function(data) {
$("#id").append("all done!</br>");
});
});
與jQuery 1.5+
1爲曲線圖進行測試。 :)您是否考慮過分塊處理數據,即每隔10k行發送一個單獨的請求? –
+1解釋。你是否嘗試過使用async true .. – sathish
我同意上面的Zsolt,考慮將你的數據分成幾個更小的請求,可以給你更快的響應,也可以計算完成的請求數的%基數。同時在單個請求中上傳大量數據,雖然是異步,但也會導致性能下降。 –