两个同步AJAX请求将无法并行运行(Two simultaneous AJAX requests w

2019-08-18 03:22发布

我有两个同时发生的AJAX请求运行的问题。 我这是将数据导出到XSLX的PHP脚本。 此操作需要大量的时间,所以我想展现给用户的进展。 我使用AJAX和数据库的方法。 其实,我敢肯定它用于工作,但我想不出为什么,它不再在任何浏览器工作。 难道在新的浏览器什么变化呢?

$(document).ready(function() {

        $("#progressbar").progressbar();

        $.ajax({
            type: "POST",
            url: "{$BASE_URL}/export/project/ajaxExport",
            data: "type={$type}&progressUid={$progressUid}" // unique ID I'm using to track progress from database
        }).done(function(data) {
            $("#progressbar-box").hide();
            clearInterval(progressInterval);
        });

        progressInterval = setInterval(function() {
            $.ajax({
                type: "POST",
                url: "{$BASE_URL}/ajax/progressShow",
                data: "statusId={$progressUid}" // the same uinque ID
            }).done(function(data) {
                data = jQuery.parseJSON(data);
                $("#progressbar").progressbar({ value: parseInt(data.progress) });
                if (data.title) { $("#progressbar-title").text(data.title); }
            });
        }, 500);

    });
  • 进度数据库中正确更新
  • JS的计时器正在试图获得进步,我可以看到它在控制台中,但所有这些请求都加载的第一个脚本的整个持续时间,一旦脚本结束,这些AJAX的呼叫被加载

那么,为什么第二AJAX调用等待第一个跑完全程?

Answer 1:

听起来像一个会话阻塞问题

默认情况下,PHP写入其会话数据的文件。 当您启动与在session_start会话(),它会打开文件进行写入和锁定,以防止并发编辑。 这意味着,每个请求要通过使用会话PHP脚本必须等待第一届会议将与文件来完成。

解决这个问题的办法是改变PHP会话不使用的文件或关闭会话写像这样:

<?php
    session_start(); // starting the session

    $_SESSION['foo'] = 'bar'; // Write data to the session if you want to

    session_write_close(); // close the session file and release the lock

    echo $_SESSION['foo']; // You can still read from the session.


Answer 2:

有点拔头发后,我发现一个其他的方式,这些非平行AJAX请求可能发生的,完全独立的PHP的会话处理......所以我在这里张贴只是为了让任何人在这里通过谷歌与同问题。

XDebug的可能导致此,如果Zend的调试器可能嫌我不会感到惊讶。

就我而言,我有:

  • 在我的本地LAMP堆栈安装了XDebug
  • xdebug.remote_autostart启用
  • 我的IDE接受入站调试器的连接,即使没有断点活跃

这引起了我所有的AJAX测试顺序运行,不管是什么。 回想起来,使一个很大的意义(调试从事物的角度来看)来强制顺序处理的,但我根本没有注意到我的IDE仍在幕后的交互。

告诉IDE完全停止听完后,并行运行恢复,我能够重现竞争条件我一直在寻找的。



Answer 3:

要知道,session_write_close()[chrislondon的答案]可能不会解决问题,如果您已启用输出缓冲(默认在PHP 7+)。 你必须设置output_buffering =关闭在php.ini,否则会议将无法正确关闭。



Answer 4:

当使用API​​,你有时需要发出多个AJAX请求发送到不同的端点。 与其等待一个请求,通过请求并行数据完成发出下一之前,你可以加快速度与jQuery,使用jQuery的$。当()函数:

并行运行多个AJAX请求



Answer 5:

a.php只会生成一个包含两个同时AJAX调用b.php和c.php主HTML页面。 为了b.php和c.php共享会话变量,会话变量必须存在的第一个AJAX调用之前。 提供的这是真的,a.php只会和b.php可以更改会话变量的值,并看到对方的价值观。 因此,a.php只会创建会话变量,而生成HTML页面。 (至少这是它如何与罗杰斯共享虚拟主机的作品。)



Answer 6:

您还可以设置

async: true,


文章来源: Two simultaneous AJAX requests won't run in parallel