当服务器发送的事件正在运行时,不会加载带有session_start()的页面

时间:2013-07-12 17:59:10

标签: php session server-sent-events

我正在开发一个小项目来制作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函数,但这并没有解决任何问题。

我不知道为什么我遇到这个问题。我希望有一个解决方案。

1 个答案:

答案 0 :(得分:1)

PHP具有独占锁定会话。一次只能有一个进程使用它。这通常是不明显的,因为PHP进程快速启动和结束,但是使用SSE,您将永远保持会话打开,并且所有其他PHP进程将等待直到SSE进程结束。

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