带有session_start()的页面;t在服务器发送的事件运行时加载


Pages with session_start() don't load when server-sent event is running

我正在做一个制作1v1聊天系统的小项目。我想做一个可以充分利用Server-Sent Events的项目。它一直运行得很好,但最近我对代码进行了一些更改,这样聊天通常会更有效率。

当我运行事件源时,我遇到了一个奇怪的问题。当我尝试转到任何其他具有session_start()的PHP页面时,它都不会加载。

我的事件源脚本看起来像这样:

<?php
    session_start();
    require "connect.php";
    require "user.php";
    header("Content-Type: text/event-stream'n'n");
    header('Cache-Control: no-cache');
    set_time_limit(1200);
    $ms = 5000;
    //SOME MORE VARIABLES HERE
    while (1) {
        echo "data: SSESSION " . $_SESSION["conversation" . $_GET["id"]];
        echo "'n'n";
            /*CHAT SCRIPT HERE*/
        ob_flush();
        flush();
        usleep($ms * 1000);
    }
?>

会话应该返回的是会话的行数。的确如此。

如果我转到test.php:

<?php
    session_start();
    echo $_SESSION["conversation121643"];
?>

Server-Sent Event正在运行时,此页面将继续加载,直到我取消该事件。

我尝试使用ob_flush函数,但这并不能解决任何问题。

我不知道我为什么会有这个问题。我希望它能得到修复。

PHP在会话中具有独占锁定。一次只有一个进程可以使用它。这通常是不明显的,因为PHP进程开始和结束都很快,但有了SSE,会话将永远打开,所有其他PHP进程将等待SSE进程结束。

您可以执行session_write_close()将会话释放给其他进程。