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

时间:2012-01-29 14:35:36

标签: php

我有一个执行此操作的PHP脚本:

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

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

6 个答案:

答案 0 :(得分:5)

你做不到。一旦HTTP请求被发送到服务器,即使客户端断开连接,PHP脚本也将继续执行到它的结束。

在某些情况下,脚本会在打印内容时退出,但看到您没有打印任何内容,它就不会退出。

答案 1 :(得分:1)

ignore_user_abort函数设置客户端断开连接是否应中止脚本执行。您需要在脚本的beginnig中添加它

ignore_user_abort(false);

答案 2 :(得分:1)

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

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

但是,由于维持HTTP上的长连接所固有的复杂性,它更倾向于为什么要创建一个正常发生的场景的问题。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

但可以配置为不执行此操作...

查看功能

ignore_user_abort();

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

ignore_user_abort(false);

答案 5 :(得分:0)

PHP connection_aborted() Does not always works

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();
}