是否有可能同时从PHP服务器接收几个AJAX响应?

And*_*ban 5 javascript php ajax jquery progress-bar

我想在我的网站上创建一个跟踪执行PHP脚本的进度条.

PHP脚本与Google API建立了一系列连接,并将收到的数据存储在数据库中.有时这个过程可能需要一分钟.

PHP脚本位于ajax/integrations-ajax.php文件中,并通过GET AJAX请求发送,如果在网站上点击#link按钮.下面是请求的jQuery代码:

$('#link').on('click', function () {
    var interval = setInterval(trackStatus, 1000);
    $.getJSON('ajax/integrations-ajax.php', {action: 'link'}).done(function (json) {            
        if (json.result == true) {
            showMessage('The account is successfully linked.', 'success');
        } else {
            showMessage('There is an error happened.', 'danger');
        }
    })
});
Run Code Online (Sandbox Code Playgroud)

#link按钮,还设置trackStatus每秒触发功能的间隔:

function trackStatus() {
    $.getJSON('ajax/status-ajax.php', { 
        action: 'status'
    }).done(function (json) {
        console.log(json.status);
    });
}
Run Code Online (Sandbox Code Playgroud)

如您所见,trackStatus函数将GET AJAX请求发送到ajax/status-ajax.php文件,并且应该每秒在浏览器控制台中显示状态.

为了在服务器上实现跟踪能力,我在ajax/integrations-ajax.php文件中创建了PHP脚本以在数据库中存储状态.您可以在下面看到它的代码:

<?php
if(!is_ajax_request()) { exit; }
$action = isset($_GET['action']) ? (string) $_GET['action'] : '';
if ($action == 'link') {
    set_status_in_database(0);
    // some execution code;

    set_status_in_database(1);
    // some execution code;

    set_status_in_database(2);
    // some execution code;

    set_status_in_database(3);
    // some execution code;
    echo json_encode(['result' => true ]);
}
Run Code Online (Sandbox Code Playgroud)

并创建了另一个PHP文件axax/status-ajax.php,可以从数据库中恢复状态:

<?php
if(!is_ajax_request()) { exit; }
$action = isset($_GET['action']) ? (string) $_GET['action'] : '';
if ($action == 'status') {
    $return['result'] = get_status_from_database();
    echo json_encode($return);
}
Run Code Online (Sandbox Code Playgroud)

但这些要求似乎没有同时发挥作用.在收到trackStatus完成ajax/integrations-ajax.php脚本的响应之前,我无法接收函数响应.

我在浏览器中创建了一个分析记录,其中显示: 在此输入图像描述

那么,是否有可能同时执行请求?或者为了实现跟踪能力,我需要重新思考整个方法?

在此先感谢您的帮助!


更新 谢谢大家的建议!特别是@Keith,因为他的解决方案是最简单的并且有效.我已将session_write_close()函数放在脚本的开头,一切正常:

<?php
if(!is_ajax_request()) { exit; }
$action = isset($_GET['action']) ? (string) $_GET['action'] : '';
if ($action == 'link') {
    session_write_close();
    set_status_in_database(0);
    // some execution code;

    set_status_in_database(1);
    // some execution code;

    set_status_in_database(2);
    // some execution code;

    set_status_in_database(3);
    // some execution code;
    echo json_encode(['result' => true ]);
}
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到来自浏览器的分析记录: 在此输入图像描述

Kei*_*ith 4

虽然 PHP 可以毫无问题地处理并发请求,但确实会被序列化的一个区域是 Session,基本上 PHP 在请求期间会为该用户在 SESSION 上放置一个独占锁。IOW:当此锁打开时,来自同一用户的其他请求将不得不等待。这通常不是问题,但如果您有长时间运行的请求,它会阻止其他请求,例如 AJax 请求等。

默认情况下,PHP 将在结束请求时写入会话数据。但如果您确定不再需要写入任何会话数据,调用session_write_close将更快地释放锁定。

更多信息在这里 - > http://php.net/manual/en/function.session-write-close.php