PHP根本没有检测到连接中止

我已阅读并深刻理解这些:
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,并且直到结束才会调用shutdown函数.事实并非如此.

正如预期的那样,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秒).

解决方法:

首先,我也没能使用基本的ubuntu 12.04 LAMP安装(php5.3)来实现它.但我有一些信息,希望它有所帮助.任何评论或编辑赞赏!

上一篇:java – 通过断开连接的套接字写入不会抛出


下一篇:阿里云对象存储OSS支持版本管理特性