首先,我在撰写此主题之前阅读了有关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 );
}
?>
我需要做些什么才能让它更准确?
谢谢
答案 0 :(得分:0)
connection_aborted()
的含义是,服务器知道,与客户端的连接已丢失。事实上,情况往往并非如此:
长话短说:这是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();
}