SSE不记录断开连接

时间:2019-02-28 17:09:49

标签: php

我目前有一个简单的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

1 个答案:

答案 0 :(得分:0)

您的代码无法检测到断开连接,因为您需要先写信给用户,然后才能检测到断开连接

虽然看起来您的演示代码可以做到这一点,但实际上却没有。这是您的代码现在要做的:

detect_connection();
sendMsg();
sleep();
detect_connection();
sendMsg();
<timeout>

在您的示例中触发连接断开消息的唯一方法是,如果您第一次调用“ sendMsg()”时关闭了连接,那么可能不会发生,因为您不够快