使用AJAX检查PHP脚本的进度

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.'); }); }); }); 

你好再次Stackoverflow!

我目前正在开发的系统脚本运行速度很慢,有时可能持续20秒。 (创建大量文件夹,移动大量文件等)。 这就是为什么我设计这个脚本。 我创建了一个小的假任务,只持续约100秒。 当我使用AJAX触发该脚本时,它完成了一定数量的任务。 每次任务完成时,我都会使用脚本的进度更新我的$_SESSION变量,并使用另一个jQuery脚本将其加载到我的页面上。

但它有点奇怪。 我认为它确实启动了checkProgressTimeout和虚拟任务(使用checkProgressTimeout函数,它每隔500毫秒检查一次进度),但是当我查看控制台时,我看到它只触发事件但是没有得到任何结果,直到虚拟任务完成然后以相同的时间间隔(500毫秒)慢慢返回进度检查。

Google Chrome中会出现此问题。 该脚本在IE中根本不起作用。

我已经建立了一个jsFiddle: http : //jsfiddle.net/nZAs4/2/ 。 但由于jsFiddle不支持PHP脚本,我已经有权将自己上传到我自己的虚拟主机中。 (我也允许Access-Control-Allow-Origin)。

那我怎么能让它发挥作用呢?

由于N3rd决定在这里复制并粘贴我的:

默认情况下,在当前脚本终止之前,其他脚本无法访问您的会话变量。 完成会话数据处理后,您必须调用session_write_close()才能保留数据。

这可以按如下方式完成:

  1. 开始会议
  2. 为此运行脚本创建db条目
  3. 更新会话以记录此记录的索引
  4. 关闭你的会话以写session_write_close();
    • 这允许您的监视脚本开始工作
  5. 运行脚本的处理部分(需要很长时间)WHILE更新db条目及其进度

在监控脚本上:

  1. 启动会话(这将挂起,直到另一个脚本中的同一会话完成/写入关闭)
  2. 检查作业索引的会话
  3. 从数据库中获取数据
  4. 显示进度
  5. 关闭会议

默认情况下,在脚本终止之前,会话变量不会更新。 您必须调用session_write_close()才能保留数据。