我在网上看到了作者设置SSE/EventSource
的教程,并在服务器PHP脚本中回显了一些数据,然后调用ob_flush()
和flush()
将数据发送回客户端浏览器。这样可以正常工作,新数据每隔3秒就会被推送到客户端。
但我也看到有人说这是使用SSE的错误方法。这个人说SSE的重点是服务器应该保持连接以及使用上述方法将新数据推送到客户端的原因是因为EventSource实现了服务器断开连接。这个人说服务器应该使用循环并通过使用sleep来每隔几秒推出数据。
那么,是这样的吗? 应该通过在服务器上设置循环来实施SSE 并推送数据,使用sleep()
来推动推送?
答案 0 :(得分:2)
我不知道PHP是否足以说明sleep()
是唯一的方法,但是服务器端的一点是保持连接打开,以便可以随时将新数据发送到客户端无需打开新连接。
这有几个皱纹。由于SSE旨在与传统的共享Web托管一起使用,因此预计服务器端会在某个时刻出现超时(30秒或60秒,在PHP中取决于max_execution_time
和/或set_time_limit()
这导致了第二次褶皱,因为服务器预计会定期断开连接,预计浏览器会自动re-establish the connection,这解释了你提到的博客文章中看到的行为 - 浏览器会自动重新连接,所以它看起来好像是SSE正在运作。
我认为sleep()
你失去了一些real time方面,好像你每秒只发送数据一样你也可以使用AJAX轮询,但我知道在PHP中没有更好的方法比循环/睡眠方法。此外,如果您使用PHP进行SSE,请记住会话对象是单线程的,因此如果您在SSE页面中将其保持打开状态,它将阻止需要访问的任何其他脚本(例如AJAX请求)。