2013-11-23 50 views
2

我在我的项目中使用服务器发送的事件,其中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); 
     }   
    } 
} 

感谢

+0

而且,当然,在问你之前,你是否忠实地使用了“不能发送会话缓存限制器 - 已经发送的头文件”? –

+3

如果您使用系统的CRON而不是循环脚本,它会更好吗? – Gadoma

+1

对于来自客户端的事件的持续轮询,您可能希望查看Ajax。 (也有一种称为“长轮询”的技术,但它不适用于香草PHP AFAIK - [如何实现Comet?](http://stackoverflow.com/q/8118828) –

回答

0

这不是一个好主意。 HTTP是一个请求 - 响应协议,所以如果你希望服务器 - 客户端通信是双向的,你将需要查看websockets或类似的东西。还有类似“长时间轮询”和“心脏跳动”的事情

如果你想要一个事件循环,在Apache Tomcat中尝试类似servlet的东西。

由于您的设计,您可以在几个小时内解决问题。

如果您只是想将消息从javascript发送到PHP,请查看ajax。

确保你知道你用:)

+0

我可能没有用最好的方式解释我的情况:我不需要“双向”通信,但只需要服务器 - >客户端通信。 仅供参考我已经使用ajax与服务器端进行异步通信。 – Socket2104

+0

为什么无限循环呢? – FaddishWorm

+0

每当发生服务器通知事件时,循环内的代码都会将其读取并将其写入侦听的客户端JS。 AFAIK没有其他方法可以用SSE执行 – Socket2104

0

工作的技术堆栈的概述你不需要用SSE无限循环。 EventSource保持与服务器的开放连接,并且服务器端数据的任何更新都将被客户端读取。

Check out basic usage of SSE here

0

我做同样的事情OP和遇到同样的问题。其中一些答案不明白eventSource应该如何工作。我的代码与您的代码完全相同,并使用会话变量来知道用户在哪个视图上驱动哪些数据在发生服务器触发时返回。它是实时协作应用程序的一部分。

我简单地在session_start()前加@来抑制日志中的警告。不是一个真正的修复,但它可以防止日志填满。

另外,不知道它对你的应用程序有多好,但你可以使用ajax将你正在监视的会话变量写入数据库,然后你的eventSource脚本可以监视数据库中的变化,而不必开始会话。

相关问题