我正在做一个制作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()
将会话释放给其他进程。