PHP connection_aborted()并不总是有效

时间:2014-05-08 00:40:36

标签: php connection client

首先,我在撰写此主题之前阅读了有关connection_aborted的stackoverflow中的许多主题,但我没有找到我想要的解决方案。

我希望在服务器和客户端之间的连接终止时,以下脚本正确结束。有时工作,有时不工作。我不知道为什么。

示例代码如下:

<?php

ignore_user_abort( true );
register_shutdown_function( 'shutdown' );


$url = "http://127.0.0.1:8000";
$file_handler = @fopen( $url, "rb" ) or die("Open failed");

foreach ( $http_response_header as $h )
{
    header( $h );
}

$bytes = 0;
while ( ! feof( $file_handler ) and ! connection_aborted() )
{
    $response = stream_get_line( $file_handler, 4096 );
    $bytes += strlen( $response );
    echo $response;
}

fclose( $file_handler );


function shutdown()
{
    global $file_handler;

    if ( ! is_null( $file_handler ) )
    {
        fclose( $file_handler );
        //do some other code
    }

    posix_kill( getmypid(), 9 );
}

?>

我需要做些什么才能让它更准确?

谢谢

2 个答案:

答案 0 :(得分:0)

connection_aborted()的含义是,服务器知道,与客户端的连接已丢失。事实上,情况往往并非如此:

  • 想想客户拔掉网线,走出WiFi覆盖范围,用他的手机开车进入地下停车场:没有包含说明连接终止的数据包在客户端和服务器之间进行通信。这意味着,当发送回复失败时,服务器将了解连接丢弃 - 可能在脚本结束后很长时间。
  • 想想一个繁忙的服务器(网络繁忙):很可能,只有在你的脚本运行了相当长的时间之后才能在网络服务器上接收和处理connection.ending数据包。

长话短说:这是TCP的一个属性,可能无法立即检测到连接丢失。

答案 1 :(得分:0)

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