我正在开发一个小项目来制作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
函数,但这并没有解决任何问题。
我不知道为什么我遇到这个问题。我希望有一个解决方案。
答案 0 :(得分:1)
PHP具有独占锁定会话。一次只能有一个进程使用它。这通常是不明显的,因为PHP进程快速启动和结束,但是使用SSE,您将永远保持会话打开,并且所有其他PHP进程将等待直到SSE进程结束。
您可以执行session_write_close()
以释放与其他进程的会话。