2

我正在做一个小项目来制作一个 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功能,但这并不能解决任何问题。

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

4

1 回答 1

2

PHP 对会话有独占锁定。一次只能使用一个进程。这通常是不引人注意的,因为 PHP 进程快速启动和结束,但使用 SSE,您将永久保持会话打开,所有其他 PHP 进程将等到 SSE 进程结束。

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

于 2013-09-01T18:42:24.073 回答