同时多个ajax请求

Fre*_*sky 1 php ajax progress-bar

我有一个经过验证然后使用以下处理程序提交的表单:

submitHandler:function (form) {


    $.ajax({
        url: 'long_process.php',
        type: 'POST',
        data: $(form).serialize(),
        success: function (result) {
            // ... Redirect ...
        }
    });


    //start polling
    (function poll() {
        setTimeout(function () {
            $.ajax({
                url: "get_progress.php",
                success: function (data) {

                    console.log(data);
                    //Setup the next poll recursively
                    poll();
                },
            });
        }, 3000);
    })();


}
Run Code Online (Sandbox Code Playgroud)

long_process.php大约需要 30 秒才能完成,同时我想跟踪进度,通过get_progress.php它回显处理完成的百分比。

启动此脚本时,我进入控制台(已编辑)

1 POST long_process.php
2 GET get_process.php (3 seconds later)...
...stuck here until long_process.php finishes THEN 
3 GET get_process.php (3 seconds later)...
4 GET get_process.php (3 seconds later)...
...
Run Code Online (Sandbox Code Playgroud)

但在完成之前都不会get_progress.php返回任何值。long_process.php

如何实现同时多个ajax请求?最终这将用于显示进度条。

小智 6

如果您在 PHP 中使用会话,则一个调用将阻止另一个调用,因为 PHP 不允许两个请求同时使用同一会话空间。您的两个请求可能正在触发,但在服务器完成第一个请求之前,您不会收到第二个请求。

为了解决这个问题:

选项 1:不要在您调用的第一个脚本中使用会话,或者如果必须的话,使用 session_write_close() 解锁会话。当然,调用这个之后,你就不能写入任何会话变量了。

选项 2:如果读取和写入会话变量是必需的,则不要在第二个 AJAX 调用中使用会话变量,也不要声明会话开始。让您的第一个脚本将其状态放在其他地方供您读取(在数据库中,/tmp 上的文件),然后让第二个脚本从那里读取状态。

希望有帮助!