2

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

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

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

4

1 回答 1

2

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

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

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

于 2013-01-01T19:14:37.550 回答