【发布时间】:2014-03-25 13:46:06
【问题描述】:
我正在用 PHP 做一个小实验。我有一个名为“infinity.txt”的文件,在该文件中,我每 0.25 秒写入一个递增数字。
while(true){
file_put_contents('infinity.txt', ++$i.PHP_EOL, FILE_APPEND);
usleep(250 * 1000);
}
这很好用,但是当我关闭浏览器中的选项卡时,脚本会继续运行。浏览器请求中止不是Ctrl. + C,所以这并不奇怪,但我仍然想知道当用户断开连接时是否可以中止无限循环,或者是否有任何方法可以查看用户是否仍然连接.
顺便说一句,事先调用register_shutdown_function 是完全没有用的,即使链接函数内部有die()。
更新:在我看来,使用connection_aborted() 函数可能会完成一些事情。
更新 2:我已将代码更改为如下所示,但是,无限循环并没有取消:
while(true){
if(connection_aborted()){
file_put_contents('infinity.txt', 'CONNECTION ABORTED.', FILE_APPEND);
die();
}
file_put_contents('infinity.txt', ++$i.PHP_EOL, FILE_APPEND);
usleep(250 * 1000);
}
更新 3:我现在在每次迭代中回显和刷新一些文本,但仍然无济于事:
while(true){
echo '0';
ob_flush();
flush(); // necessary for proper checking
if(connection_aborted()){
file_put_contents('infinity.txt', 'CONNECTION ABORTED.', FILE_APPEND);
die();
}
file_put_contents('infinity.txt', ++$i.PHP_EOL, FILE_APPEND);
usleep(250 * 1000);
}
更新 4:上一个更新中显示的代码在重新启动 Apache 时出于某种奇怪的原因开始工作,而我没有更改 php.ini 中的任何设置。最终的帮助是在一开始就添加了ignore_user_abort(true);。
【问题讨论】:
标签: php browser infinite-loop abort