我已经阅读并深刻理解了这些: http ://www.php.net/manual/en/features.connection-handling.php http://www.php.net/manual/en/function.register-shutdown-function .php
但是,我已经测试了 PHP 5.1.6 和 5.3,但事情并没有像那里描述的那样工作。我观察到的是:
- connection_status() 始终返回 true,即使在客户端关闭连接之后也是如此。
- 即使ignore_user_abort为0,客户端关闭连接后脚本的执行仍会继续
- 在脚本结束之前,使用 register_shutdown_function() 注册的函数不会运行。当客户端中止连接时,脚本不会被中断(因此函数不会被调用)。
所以基本上 PHP 根本不会检测到客户端的断开连接。
请注意,这并不是将 ignore_user_abort 设置为 1:如果是这种情况,则 connection_status() 将返回 1,即使脚本将继续运行并且直到结束才会调用关闭函数。事实并非如此。
ini_get("ignore_user_abort") 按预期返回 0。
这是 PHP 中的错误,还是由于某些 Apache 设置?
如何让 PHP 按照上述文档中的描述工作?
测试脚本:
<?php
function myShutdown() {
error_log("myShutdown ".connection_status()." ".ini_get("ignore_user_abort"));
}
register_shutdown_function(myShutdown);
echo "Hi!";
error_log(" *** test/test *** ");
for ($i=0; $i<10; $i++) {
sleep(1);
error_log(".");
echo ".";
}
?>
重现步骤: - 访问脚本的 url - 在 10 秒过去之前中止客户端上的连接(例如点击浏览器中的停止按钮)
预期/期望的行为:日志应显示少于 10 个点,并在末尾显示“myShutdown 1 0”(如果您实时查看日志,则 myShutDown 应在客户端断开连接时立即出现)
观察到的/当前的行为:日志总是显示正好 10 个点,最后显示“myShutdown 0 0”(如果您实时观看,无论客户端何时断开连接,它都会持续 10 秒)。