我有一个ajax脚本,可以在10到30秒的时间内执行。在执行PHP文件期间,PHP脚本将会话参数设置为不同的状态。这背后的想法是让第二个ajax与第一个ajax运行异步,以更新当前的工作流程。
为此,我使用以下ajaxStart和ajaxStop:
function getScriptState(){
$.ajax({
url : "/modules/core.iris/ajax/getState.ajax.php",
type : "GET",
dataType : "json",
async : true,
global: false,
success : function (d){
if( $('#statusMsg').length !== 0 ){
if( typeof d.statusMsg !== "undefined" ){
$('#statusMsg').html( d.statusMsg );
}
}
}
});
}
function clearScriptState(){
$.ajax({
url : "/modules/core.iris/ajax/clearState.ajax.php",
...
});
}
var loaderMsg = null;
$( document ).ajaxStart(function() {
getScriptState();
loaderMsg = setInterval( getScriptState, 500 );
});
$( document ).ajaxStop(function() {
clearScriptState();
clearInterval( loaderMsg );
});
调用longrunning PHP脚本的脚本如下:
$.ajax({
url : "/modules/core.wages/ajax/wagesLines.ajax.php",
async : true,
type : "POST",
data: weeks,
dataType: "json",
success : function(d){
....
问题是,getScriptState()实际上并不与上述脚本一起运行异步。它实际上不会返回状态,直到longrunning ajax调用结束前的毫秒。
从我的控制台日志完成后,看起来它在长跑脚本完成之前已经运行了两次,但这并不反映在DOM中。
以下是chrome中网络时间轴的图片。显示getState被调用一次,然后运行wageLines.ajax.php的结果,然后再次运行getState几次。那几次应该在wageLines.ajax.php之前,因为它没有完成获取数据:
如此屏幕截图所示,问题是所有对getState.ajax.php的调用都在运行,直到salaryLines.ajax.php完成。所以无论getState.ajax.php只需要100ms来执行,它都不会完成,直到wageLines.ajax.php为止。
有人有任何想法吗?
答案 0 :(得分:1)
由于调用的两个脚本都试图访问同一个PHP会话,因此会出现此问题。
默认情况下,PHP会锁定会话,直到脚本完成。
可以使用session_write_close()
修复此问题。
参考:Long running background PHP script blocks other PHP pages until it is finished