所以我有一个用户填写的表单,当提交一个新选项卡打开以加载结果时 - 该脚本遍历多个XML文件 - 这可能是一个耗时的过程,因为该脚本中发生了很多事情(2 -10分钟)。我想要一些能够跟踪结果页面进度的AJAX,所以我做的是让结果页面更新用户的会话(你可能只想跳到我的问题的底部)示例:
$_SESSION['fileCount'] = $fileCount;
for($i=0;$i<fileCount;$i++){//iterate through xmls
$_SESSION['curFile'] = $xml[...];
$_SESSION['curCount'] = $i;
//Do stuff
}
父页面上的表单标记如下所示:
<form action="results/" method="post" onsubmit="openProgressDialog()" target="_blank">
上面的函数如下:
function openProgressDialog(user){
$('#loadSplash').dialog('open');
var loading = true;
var sleep = 50;
var precent = 0;
var fileCount = 0;
var i = 0;
var curFile = '';
while(loading){
$.getJSON('php/getProgress.php?u='+user, function(data) {
var items = [];
$.each(data, function(key, val) {
if(key == 'fileCount')
fileCount = val;
else if(key == 'curCount')
i = val;
else if(key == 'curFile')
curFile = val;
});
if(fileCount > 0){
//Do stuff
$('#pregressbar').progressbar('value',(i/fileCount)*100);
if(i == fileCount){
sleep = 0;
loading = false;
}
}
}).delay(sleep);
}
}
最后getProgress.php看起来像:
<?php
session_start();
$progress =array('fileCount' =>intval($_SESSION['fileCount']),'curCount' =>intval($_SESSION['curCount']),'curFile'=>$_SESSION['curFile']);
echo json_encode($progress);
?>
所以我知道我只使用了伪代码和真实代码的奇怪组合,我也知道JS函数不完整 - 我一直在监视firebug中的.NET面板以验证功能。
所以我的问题是getProgress.php在结果/ index.php页面完成之前不会返回 - 这完全违背了所有这一切的目的。是否有一些关于多个PHP脚本同时执行或使用相同的资源,这是我在这里举行的?
我正在LAMP / Ubuntu上运行新版本的apache / php。
作为旁注/问题,我对这个主题特别感兴趣,因为我正在计划一个使用AJAX / php / mySQL /长轮询的多人游戏,我很好奇是否有什么我应该注意冒险进入那个项目。
答案 0 :(得分:3)
我曾经问过一次类似的问题Show progress for long running PHP script。
关键是,会话不能共存。您无法同时在2个脚本上打开相同的会话,其中一个会触发错误。
您应该做的是将状态写入数据库表,并从您的AJAX调用中读取。另一种选择是使用APC缓存。