gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:34:19 27 4
gpt4 key购买 nike

我想在我的网站上制作一个进度条,用于跟踪 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');
}
})
});

这个 #link 按钮,还设置了每秒触发 trackStatus 函数的时间间隔:

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

如您所见,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 ]);
}

并创建了另一个可以从数据库中恢复状态的 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);
}

但是这些请求似乎并没有同时工作。在未收到完成响应 ajax/integrations-ajax.php 脚本之前,我无法收到 trackStatus 函数的响应。

我在浏览器中做了一个profiling记录,结果显示: enter image description here

那么,有没有可能同时执行请求呢?或者为了实现跟踪功能我需要重新考虑整个方法?

在此先感谢您的帮助!


更新谢谢大家的建议!尤其是@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 ]);
}

在这里你可以从浏览器中看到分析记录: enter image description here

最佳答案

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

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

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

关于javascript - 是否有可能同时从 PHP 服务器接收多个 AJAX 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54066396/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com