我在我的项目中使用服务器发送的事件,其中JS调用一个PHP页面,说eventserver.php它基本上由一个无限循环组成,它检查事件在$ _SESSION变量中。 在我的第一个实现中,这导致我的网站挂断,因为事件服务器在会话锁定并且在超时过期之前没有释放它;但是,我设法通过在循环中连续使用session_write_lock()和session_start()来锁定/解锁会话来解决此问题。使用服务器发送的事件和PHP会话
这实际上导致了很多PHP警告(在apache error.log),说“无法发送会话缓存限制器 - 头已发送”,“无法发送会话cookie”等。
发布一些代码在这里
session_start();
header('Cache-Control: no-cache');
header('Content-Type: text/event-stream');
class EventServer
{
public function WaitForEvents($eventType)
{
// ... do stuff
while(true)
{
// lock the session to this instance
session_start();
// ...check/output the event
ob_flush();
flush();
// unlock the session
session_write_close();
sleep(1);
}
}
}
感谢
而且,当然,在问你之前,你是否忠实地使用了“不能发送会话缓存限制器 - 已经发送的头文件”? –
如果您使用系统的CRON而不是循环脚本,它会更好吗? – Gadoma
对于来自客户端的事件的持续轮询,您可能希望查看Ajax。 (也有一种称为“长轮询”的技术,但它不适用于香草PHP AFAIK - [如何实现Comet?](http://stackoverflow.com/q/8118828) –