【问题标题】:Correct method of implementing SSE/EventSource?实施 SSE/EventSource 的正确方法?
【发布时间】:2013-01-01 15:10:00
【问题描述】:

我在网上看过教程,作者设置SSE/EventSource,在服务器PHP脚本回显一些数据,然后调用ob_flush()flush()将数据发送回客户端浏览器。这工作正常,每 3 秒将新数据推送到客户端。

但我也读到有人说这是使用 SSE 的错误方式。这个人说,SSE的全部意义在于服务器应该保持连接,而使用上述方法将新数据推送到客户端的原因是因为EventSource实现了服务器断开连接。这个人说服务器应该使用循环并通过使用睡眠每隔几秒钟将数据推送出去。

那么,是这样的吗? 是否应该通过在服务器上设置循环来实现 SSE 并推送数据,使用 sleep() 来调整推送速度?

【问题讨论】:

  • 另外,看看这个问题:stackoverflow.com/questions/9565290/…
  • "在服务器端,脚本 (...) 以以下形式发送消息,具有 text/event-stream MIME 类型。"这跟我的问题有什么关系?而且您发布的其他链接也与我的问题无关,即推荐的实现 SSE 的方法是什么,即我们是否应该始终在服务器上使用无限循环?
  • 另一个问题是“如何触发 SSE 事件?”,而您问的是 “如何实现 SSE?”。这可能不是同一个确切的问题,但我认为其他问题不是无关紧要的。
  • stackoverflow 的一大优点是互相帮助,这样我们就不必去挖掘冗长的术语填充标准文档,这些文档可能会或可能会提供答案。 FWIW 我去查看了您链接中的标准,但没有找到答案。
  • 据我了解,服务器应该关闭连接,所以你上面链接的教程做错了。我不是 PHP 程序员,但带有循环和sleep(); 接缝的解决方案是合理的(MDN article 就是这样做的)。

标签: javascript html server-sent-events


【解决方案1】:

我不太了解 PHP 是否可以说 sleep() 是唯一的方法,但是服务器端的重点是保持连接打开,以便可以随时将新数据发送到客户端而无需打开一个新的连接。

这有几个问题。由于 SSE 旨在与传统的共享网络托管一起使用,因此预计服务器端会在某个时间点出现超时(30 秒或 60 秒,在 PHP 中取决于max_execution_time 和/或set_time_limit()。这会导致第二个问题,因为预计服务器会定期断开连接,因此预计浏览器会自动re-establish the connection,这解释了您提到的博客文章中看到的行为 - 浏览器会自动重新连接,因此看起来好像 SSE 正在工作。

我认为使用sleep() 你会失去一些real time 方面,就好像你只是每秒发送数据一样,你不妨使用 AJAX 轮询,但我知道 PHP 中没有比循环更好的方法/睡眠方法。此外,如果您将 PHP 用于 SSE,请记住会话对象是单线程的,因此如果您在 SSE 页面中将其保持打开状态,它将阻止任何其他需要访问的脚本(例如 AJAX 请求)。

【讨论】:

  • 如果是这种情况,那么循环在 PHP 中是不是完全没用,因为无限循环无法处理新请求?
  • @sonicboom 我不确定你的意思?为什么不处理新的请求?
  • 因为每个会话有一个线程,我们进入一个无限循环每隔几秒向客户端发送 SSE 消息,那么当线程关联时我们如何处理来自该客户端的新请求与会话正在循环中迭代。
  • @sonicboom 对不起,应该更清楚 - 它是单线程的会话对象,so don't hold it open
猜你喜欢
  • 2016-02-02
  • 1970-01-01
  • 2020-06-27
  • 2012-08-22
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
相关资源
最近更新 更多