在ajax运行时设置轮询脚本不起作用

时间:2014-11-21 14:06:04

标签: jquery ajax

我有一个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之前,因为它没有完成获取数据:

enter image description here

如此屏幕截图所示,问题是所有对getState.ajax.php的调用都在运行,直到salaryLines.ajax.php完成。所以无论getState.ajax.php只需要100ms来执行,它都不会完成,直到wageLines.ajax.php为止。

有人有任何想法吗?

1 个答案:

答案 0 :(得分:1)

由于调用的两个脚本都试图访问同一个PHP会话,因此会出现此问题。

默认情况下,PHP会锁定会话,直到脚本完成。

可以使用session_write_close()修复此问题。

参考:Long running background PHP script blocks other PHP pages until it is finished