带有sleep()的PHP脚本在连接关闭时不会退出


PHP script with sleep() does not exit on connection close

我有一个PHP脚本可以做到这一点:

$sec = 1;
$id = 1;
while ($sec<20) {
    sleep(1);
    mysql_query("update test set sec = $sec where id = $id");
    $sec++;
}

每当我在浏览器中加载脚本时,即使我在5秒钟后关闭了浏览器窗口,它也会继续运行。如何更改此设置,以便在浏览器窗口关闭时脚本将退出?

你不能。一旦HTTP请求被发送到服务器,PHP脚本将继续执行到最后,即使客户端已经断开连接。

在某些情况下,脚本可能会在打印内容时退出,但由于您没有打印任何内容,它不会退出。

ignore_user_abort函数设置客户端断开连接是否应中止脚本执行。你需要在你的脚本的开头添加这个
ignore_user_abort(false);

很大程度上取决于Web服务器将向PHP解释器传递什么信息-即使作为CLI运行,PHP也可能只在客户端尝试写入其pty时检测到客户端已中止。

在某些情况下,Web服务器可能会向解释器发送信号。但是PHP没有可靠的方法来检测HTTP连接是否真的已经中止。

但是,考虑到通过HTTP维护长连接所固有的复杂性,这就引出了一个问题,即为什么要创建一个正常发生这种情况的场景。

您可以使用一个会话变量,该变量会在关闭浏览器时销毁,如果不再设置,则可以中断操作。

PHP脚本在web服务器上的进程中运行。简单地关闭浏览器并不一定会终止这个过程。这意味着即使浏览器连接关闭,脚本也可能继续执行。

但是,可以将其配置为不执行此操作。。。

看看的功能

ignore_user_abort();

把它放在脚本的顶部应该会在用户关闭浏览器后阻止它运行

ignore_user_abort(false);

PHP connection_abored()并不总是能正常工作

TCP要求客户端确认所有发送的数据包,因此服务器至少应该将其检测为发送超时。。。

session_write_close();//to make flush work
while (connection_status() !== 0) {//this will work if the connection is properly shutdown
                                   //or if it is simply disconnected...
  sleep(1);
  echo "whatever";
  ob_flush();
  flush();
}