我正试图获得一个进度条,显示一个长进程的实时进度。我想我已经完成了大部分,但我遇到了一个有趣的障碍。
简而言之,我有一个按钮,当它启动时会调用一个JavaScript函数,该函数将做两件事:
- 启动一个异步Ajax调用来启动我的长时间运行的脚本。这个脚本将用某些关键代码块的进度更新一个表,所以一个表将有一个从0到100的数字和一些消息
- 在计时器中启动一个同步调用,读取数据库表中为用户更新进度条所做的进度
当我启动它时,我注意到(2(将等待(1(。我注意到调用已发送(在DeveloperTools->Debug中(,但(我相信(CodeIgniter会将第二个Ajax调用排队,直到第一个调用完成。
有没有办法绕过这一点,让我的(2(调用多次往返于DB,而(1(仍在执行?
只是放一些代码:
function button_pressed_for_long_action(type, id)
{
//start the timer
timer = window.setInterval(get_progress, 3000);
//call the long script");
$.ajax({
url: "/the URL for long action/",
dataType: "json",
method: "POST",
data: {
type : type,
id : id
},
success:function(data)
{
},
error: function( data, status, error ) {
alert("error");
alert(error);
}
});
}
以及计时器调用的获取进度的函数:
function get_progress()
{
$.ajax({
url: "/url to get process/",
dataType: "json",
method: "POST",
async : false,
data: {
some_id : some_id
},
success:function(data)
{
//update UI
if (progress < 100)
{
//exit if not done
return;
}
//script is finished
window.clearInterval(timer);
},
error: function( data, status, error ) {
alert("error");
alert(error);
}
});
}
URL调用CodeIgniter控制器函数,读取DB并正确返回带有信息的JSON。
问题只是获取进度(2(要等到(1(完成。
提前感谢!
经过更多的挖掘,我找到了它。PHP似乎像我想的那样将请求排队。队列是每个会话的。因此,如果会话被关闭,那么锁定就会解除,另一个呼叫就可以通过。
因此,在我的情况下,我需要在长执行脚本的开头有以下行:
The_long_script_controller.php
function execute_long_script()
{
//this is the line I needed:
session_write_close();
//then do the full long processing
}
全部基于此线程:两个同时的AJAX请求获胜';t并行运行
这修复了我的问题