-->

PHP没有检测到连接中止所有(PHP doesn't detect connection a

2019-08-22 19:37发布

我已阅读并深刻领悟这些: 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秒无论何时客户端断开连接)。

Answer 1:

首先,我也没能得到它的工作,利用基本的Ubuntu 12.04安装LAMP(PHP5.3)。 但是我有一些信息,并希望它是有帮助的。 任何意见或编辑的赞赏! :)


我看到两个问题与您的代码。 第一个是语法错误。 这是因为丢失围绕单引号myShutdown打电话时register_shutdown_function() 。 行更改为:

register_shutdown_function('myShutdown');

我看到的第二个问题是缺少flush()后调用echo秒。 该文件说:

PHP不会检测用户已中止连接,直到试图将信息发送到客户端。 只需用echo声明不保证该信息被发送,请参见冲洗()。

但是,即使flush()将不会在任何情况下帮助。 从文档flush()

冲洗()可能无法覆盖您的Web服务器的缓存模式,它有浏览器中的任何客户端缓存没有影响。 它也不会影响到PHP的用户态输出缓冲机制。 这意味着你必须同时使用ob_flush()和flush()如果你正在使用这些刷新OB输出缓冲器。

几台服务器,特别是在Win32中,仍然会缓存脚本的输出,直到它的结果发送到浏览器之前终止。

Apache的模块,比如mod_gzip,可能自己的缓冲,这将导致flush()将不会导致立即被发送到客户端的数据。

即使是浏览器可以显示之前,缓存输入。 例如Netscape浏览器,文本缓冲器,直到它接收到一个端部的行或标签的开始,并且直到最外层表的标签被认为是它不会呈现表。

微软的Internet Explorer的某些版本才开始,他们已经收到256个字节后显示的页面,所以你可能需要刷新到让这些浏览器显示页面之前发送额外的空格。

在该页面的评论有设置几个头和Apache CONFIGS的建议:

apache_setenv('no-gzip', 1); 
ini_set('zlib.output_compression', 0); 
ini_set('implicit_flush', 1); 

然而,即使这并没有为我工作。 经调查使用wiresharek,虽然Web服务器0.0037秒之后,发送内容(“你好”),Web浏览器中缓存的页面。



文章来源: PHP doesn't detect connection abort at all