session_start();
if(isset($_GET['progress'])){
$status_done = '0';
if($_SESSION['progress_percentage'] == "100"){
$status_done = '1';
}
echo json_encode(array(
'progress_percentage' => $_SESSION['progress_percentage'],
'progress_status' => $_SESSION['progress_status'],
'progress_done' => $status_done
)
);
}
elseif(isset($_GET['dummytask'])){
for ($i = 1; $i <= 100; $i++) {
$_SESSION['progress_percentage'] = $i;
$_SESSION['progress_status'] = 'Checking the locks and stuffing the dolls!';
sleep(1);
}
}
$(document).ready(function(){
var timeout = '';
function checkProgress(){
console.log('Checking progress event started');
$.ajax({
url: 'http://willetu54.fiftyfour.axc.nl/dgi/ajax.php?progress&time='+ new Date().getTime(),
cache: false,
dataType: 'json'
}).done(function(data) {
$('#progressbar-progress').html(data.progress_status +'('+ data.progress_percentage +')');
console.log('Progress checked');
console.log(data);
if(data.progress_done == "1"){
clearTimeout(timeout);
}
}).fail(function(jqXHR, status, error){
console.log('Check Progress: Error: '+ error + status +'');
});
}
function checkProgressTimeout(){
checkProgress();
console.log('Timeout tick for progress');
timeout = setTimeout(checkProgressTimeout, 500);
}
$('#menu-open').click(function(event){
checkProgressTimeout();
console.log('starting dummy task');
event.preventDefault();
$.get('http://willetu54.fiftyfour.axc.nl/dgi/ajax.php?dummytask', function(data) {
alert('Load was performed.');
});
});
});
你好,再次堆栈溢出!
我目前正在开发的系统的脚本运行速度很慢,有时可以持续长达 20 秒。(创建大量文件夹、移动大量文件等(。这就是我设计这个脚本的原因。我创建了一个小虚拟任务,它只持续~100秒。当我使用 AJAX 触发该脚本时,它会完成一定数量的任务。每次任务完成时,我都会使用脚本的进度更新我的$_SESSION
变量,并使用另一个jQuery脚本将其加载到我的页面上。
但它的效果有点奇怪。我认为它确实启动了checkProgressTimeout
和虚拟任务(使用 checkProgressTimeout
函数,它每 500 毫秒检查一次进度(,但是当我查看控制台时,我看到它只触发事件,但在虚拟任务完成之前没有得到任何结果,然后它以相同的时间(500 毫秒(缓慢返回进度检查。
此问题发生在谷歌浏览器中。该脚本在IE中根本不起作用。
我已经设置了一个jsFiddle:http://jsfiddle.net/nZAs4/2/。但是由于jsFiddle不支持PHP脚本,我有幸将其上传到我自己的一个虚拟主机。(我还允许访问控制允许原产地(。
那么我怎样才能让它工作呢?
由于 N3rd 决定复制和粘贴这是我的:
默认情况下,在当前脚本终止之前,其他脚本无法访问您的会话变量。您必须在处理完会话数据后调用 session_write_close(( 才能持久化数据。
这可以按如下方式完成:
- 启动会话
- 为此正在运行的脚本创建数据库条目
- 更新会话以记录此记录的索引
- 关闭会话以写入
session_write_close();
- 这允许您的监视脚本开始工作
- 运行脚本的处理部分(需要很长时间(同时更新数据库条目及其进度
在监视脚本上:
- 启动会话(这将挂起,直到另一个脚本中的同一会话完成/写入关闭(
- 检查会话的索引到作业
- 从数据库中获取数据
- 显示进度
- 关闭会话
默认情况下,在脚本终止之前,会话变量不会更新。您必须调用 session_write_close(( 才能持久保存数据。