我目前有一个简单的SSE页面进行测试。目前,我可以使页面在用户连接时以及连接时进行记录;但是,页面关闭时(例如,用户断开连接)似乎没有任何记录。我正在使用error_log函数进行记录。另外,使用NGINX和PHP 7.2。这是我的代码:
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('X-Accel-Buffering: no');
ignore_user_abort(true);
$aid = 1;
function sendMsg($id , $msg) {
echo "id: $id" . PHP_EOL;
echo "data: " . json_encode(array('x'=> $msg)) . PHP_EOL;
echo "retry: 0" . PHP_EOL;
echo PHP_EOL;
@ob_end_flush();
flush();
}//END FUNCTION sendMsg
function endPacket() {
echo "0\r\n\r\n";
@ob_end_flush();
flush();
}//END FUNCTION endPacket
$startedAt = time();
error_log("Starting SSE to User: " . $aid);
while (true) {
set_time_limit(15);
if ( connection_status() != 0 ) {
error_log("Ending SSE to User: " . $aid);
endPacket();
die();
}//END IF
error_log("Connected SSE as User: " . $aid);
sendMsg( $startedAt, $aid . ' | ' . connection_status() );
sleep(10);
}//END WHILE
答案 0 :(得分:0)
您的代码无法检测到断开连接,因为您需要先写信给用户,然后才能检测到断开连接
虽然看起来您的演示代码可以做到这一点,但实际上却没有。这是您的代码现在要做的:
detect_connection();
sendMsg();
sleep();
detect_connection();
sendMsg();
<timeout>
在您的示例中触发连接断开消息的唯一方法是,如果您第一次调用“ sendMsg()”时关闭了连接,那么可能不会发生,因为您不够快