我想在我的网站上制作一个进度条,用于跟踪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
文件,应该每秒在浏览器控制台中显示状态。为了在服务器上实现跟踪功能,我编写了PHP脚本,存储了状态信息到数据库中,在
ajax/integrations-ajax.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 ]);
}
我创建了另一个名为axax/status-ajax.php
的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函数的响应。
我在浏览器中进行了分析记录,结果如下:
![enter image description here](https://istack.dev59.com/5Lqgy.webp)
提前感谢您的帮助!
更新: 感谢大家的建议!特别感谢@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](https://istack.dev59.com/hc8Kj.webp)
session_write_close
,这将释放锁定。http://php.net/manual/en/function.session-write-close.php - Keith