多个ajax同时请求

时间:2016-02-23 20:16:00

标签: 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);
    })();


}

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)...
...

但在get_progress.php完成之前,long_process.php都没有返回任何值。

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

1 个答案:

答案 0 :(得分:2)

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

解决这个问题:

选项1:不要在您调用的第一个脚本中使用会话,或者如果必须,则使用session_write_close()解锁会话。当然,在调用它之后,您无法编写任何会话变量。

选项2:如果读取和写入会话变量是必不可少的,那么在第二次AJAX调用中不要使用会话变量,也不要声明会话启动。让你的第一个脚本将其状态放在其他地方供你阅读(在DB中,/ tmp上的文件),然后让第二个脚本从那里读取状态。

希望有所帮助!