PHP Conference Japan 2024

connection_aborted

(PHP 4, PHP 5, PHP 7, PHP 8)

connection_aborted检查客户端是否断开连接

描述

connection_aborted(): int

检查客户端是否断开连接。

参数

此函数没有参数。

返回值

如果客户端断开连接,则返回 1;否则返回 0。

参见

添加注释

用户贡献的注释 2 条注释

4
nathanb at php dot net
11 年前
检测连接是否关闭的一种技巧,无需发送可能损坏数据流(如二进制文件)的数据,您可以结合使用 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();
?>
2
Rupak Bajgain
1 年前
我使用的一种技巧是使用 uas 将值发送到注释中,以使用断开连接检查获得长轮询

例如,对于 json
在 connection aborted 之前发送 0 并刷新。
例如。{"x":"000000
结果准备就绪后,发送 ", 并删除第一个 { 后的 json
所以它看起来像
{"x":"00000000000","y":"result","z":"result2"}
To Top