【问题标题】:Setting a polling-script while ajax is running not working在 ajax 运行时设置轮询脚本不起作用
【发布时间】:2014-11-21 14:06:04
【问题描述】:

我有一个 ajax 脚本,有时可能需要 10-30 秒才能执行。在执行 PHP 文件期间,PHP 脚本将会话参数设置为不同的状态。这背后的想法是让第二个 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 );
});

调用长时间运行的PHP脚本的脚本如下:

$.ajax({
    url : "/modules/core.wages/ajax/wagesLines.ajax.php",
    async : true,
    type : "POST",
    data: weeks,
    dataType: "json",
    success : function(d){  
    ....

问题是,getScriptState() 实际上并没有与上述脚本异步运行。它实际上直到长时间运行的 ajax 调用完成前一毫秒才返回状态。

从我的控制台日志看,它似乎在长时间运行的脚本完成之前已经运行了两次,但这并没有反映在 DOM 中。

这是 chrome 中的网络时间线图片。显示 getState 被调用一次,然后运行工资线.ajax.php 的结果,然后再次运行 getState 几次。这几次实际上应该在工资线.ajax.php 之前,因为它还没有完成获取数据:

如此屏幕截图所示,问题在于所有对 getState.ajax.php 的调用都在运行,直到工资线.ajax.php 完成。所以无论 getState.ajax.php 是否只需要 100ms 执行,它都不会完成,直到 paysLines.ajax.php 完成。

有人有什么想法吗?

【问题讨论】:

  • 可能是你服务器的连接数有限,所以轮询请求在长请求完成后排队执行?
  • 您检查过状态测试返回的内容吗?
  • 他们都返回了正确的 {"statusMsg":"Fetching paylines"}。直到 clearState.ajax.php 运行。 @derMrich 我的服务器也配置为允许多个连接。此外,正如您从我上面的屏幕截图中看到的那样,多个正在同时运行
  • 我不明白这里使用.ajaxStart().ajaxStop() 是怎么回事。 edit 好吧,我想我会的。那么您是否将console.log() 调用添加到状态检查“成功”方法以查看它何时运行?我认为,就其价值而言,从成功处理程序而不是从计时器开始下一次状态检查会更安全,以避免同时进行多个状态检查。
  • ajaxStart 和 ajaxStop 是在 ajax 调用开始和停止时运行的函数。无论它是由于成功还是错误而停止。所以当我启动一个ajaxcall时,我也启动了函数getScriptState

标签: jquery ajax


【解决方案1】:

这个问题是由于被调用的两个脚本都试图访问同一个 PHP 会话。

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

可以使用session_write_close()修复。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    相关资源
    最近更新 更多