我已阅读并深刻领悟这些: 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的一个bug,或者可能这是由于一些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秒无论何时客户端断开连接)。