检测连接是否关闭的一种技巧,无需发送可能损坏数据流(如二进制文件)的数据,您可以结合使用 HTTP/1.1 上的分块数据,发送一个“0”(“零”)作为前导块大小,而无需其他内容。
*注意* 重要的是要注意,每隔几秒钟检查一次流并不是一个好主意。通过这样做,您可能会增加发送给用户的数据,而不会给用户带来任何好处。
这样做的一个好理由是,如果您正在生成一个运行时间很长且占用大量服务器资源的报告。这将允许服务器检测用户是否取消了下载,并在不损坏正在下载的文件的情况下进行任何清理。
这是一个例子
<?php
ignore_user_abort(true);
header('Transfer-Encoding:chunked');
ob_flush();
flush();
$start = microtime(true);
$i = 0;
function vPrint($data){
if(strlen($data))
echo dechex(strlen($data)), "\r\n", $data, "\r\n";
ob_flush();
flush();
}
function endPacket(){
echo "0\r\n\r\n";
ob_flush();
flush();
}
do{
echo "0";
ob_flush();
flush();
if(connection_aborted()){
file_put_contents('/tmp/test.tmp', sprintf("Conn Closed\nTime spent with connection open: %01.5f sec\nLoop itterations: %s\n\n", microtime(true) - $start, $i), FILE_APPEND);
endPacket();
exit;
}
usleep(50000);
vPrint("I get echo'ed every itteration (every .5 second)<br />\n");
}while($i++ < 200);
endPacket();
?>