我正在玩长轮询并尝试在新请求发生时停止由AJAX调用启动的脚本。 这是由AJAX请求启动的PHP代码:
$checker = $_SESSION['checker'] = time();
while (true) {
if ($checker != $_SESSION['checker']) {
$out = 'new one started';
break;
}
if (some other condition) {
$out = 'smth done or happend';
break;
}
sleep(3);
}
echo $out;
我一直在做一些日志记录,看起来$_SESSION['checker']
没有更新,所以如果我运行相同的脚本(应该更改$_SESSION['checker']
变量),之前启动的脚本中的while循环将仍然看到旧的$_SESSION['checker']
。为什么不更新?
答案 0 :(得分:3)
默认情况下,PHP会话不支持并发读/写操作。也就是说,当您从一个请求更新$ _SESSION数组时,它不会传播到已在运行的 PHP请求。
解决方案是创建一个文件,并监视该文件的filemtime
(文件修改时间)。每当我们看到文件已更新时,我们就知道另一个进程touch编辑了它。
实施例:
$filename = ".test_file";
// Update the file modification time to the current time
touch($filename);
$modificationTime = filemtime($filename);
while ($modificationTime === filemtime($filename) {
// Do stuff, file modification time is not yet updated.
}
// The file modification time has been updated!
请注意,您应该经常测试更改,具体取决于第一个进程终止的速度,这意味着while循环中的代码不会花费太长时间。
答案 1 :(得分:1)
您可能希望从ajax端而不是PHP端解决此问题。 您可以通过中止来停止当前的http请求,例如:
var xhr = $.ajax({
type: "POST",
url: "file.php",
data: "parameter=input&type=test",
success: function(msg){
alert( "Data Saved: " + msg );
}
});
//kill the request
xhr.abort()