我目前在PHP脚本中运行一个循环来检查用户连接是否已中止(connection_aborted() does not work on ajax calls):
connection_check.php
:
<?php
ignore_user_abort(true);
for ($i = 0; $i < 1000; $i++) {
echo "<br>";
flush();
ob_flush();
if (connection_aborted()) {
echo "nocon";
exit;
} else {
// Everything is fine
}
sleep(3);
}
?>
但是,当这个循环在&#34; background&#34;中运行时,我还需要运行我的其余PHP代码。因此,当连接中止时,脚本将死亡,但如果不是,则脚本应继续运行。我需要这样做,因为我用ajax调用调用这个PHP文件。
这是我尝试过的,然而,它不起作用(脚本继续运行并且不会死亡,connection_check.php
不回应&#34; nocon&#34;) :
file.php
<?php
$child = fopen('http://ipaddress/core/connection_check.php', 'r');
/***
* ALL PHP CODE HERE THAT SHOULD START RUNNING RIGHT AWAY WHILE CONNECTION_CHECK.PHP RUNS IN THE BACKGROUND
***/
$response = stream_get_contents($child);
if($response == "nocon") {
die();
}
?>
有任何帮助吗?如果有人有替代方案,那也值得赞赏。我已经花了一天多的时间研究这个问题,但还没有运气。
答案 0 :(得分:1)
在您的代码中,您在循环中调用sleep(3)
并且循环运行1000次,您是否尝试等待3000秒以完成循环?我假设您希望每3秒检查一次用户是否仍然连接。
我的建议是删除sleep
,删除循环并使PHP基本上只检查一次连接并返回相关的响应。每隔X秒通过AJAX调用此PHP。您可以在Javascript中查看setTimeout
和setInterval
来实现此目的。也许每次完成AJAX调用时都设置超时以再次调用它。
像这样的东西(Javascript / jQuery)
function checkConnection() {
// Ajax call here
$.ajax({
// Other AJAX stuff
complete: function() {
setTimeout(function(){
checkConnection();
}, /*<YOURTIMEHERE>*/);
}
});
}
checkConnection();
或者甚至更好的是,当连接被认为是活动时,你可以将setTimeout位置于成功回调中。
答案 1 :(得分:-2)
使用:
ob_start(); 然后你的循环