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)
虽然 PHP 可以毫无问题地处理并发请求,但确实会被序列化的一个区域是 Session,基本上 PHP 在请求期间会为该用户在 SESSION 上放置一个独占锁。IOW:当此锁打开时,来自同一用户的其他请求将不得不等待。这通常不是问题,但如果您有长时间运行的请求,它会阻止其他请求,例如 AJax 请求等。
默认情况下,PHP 将在结束请求时写入会话数据。但如果您确定不再需要写入任何会话数据,调用session_write_close将更快地释放锁定。
更多信息在这里 - > http://php.net/manual/en/function.session-write-close.php
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |