【问题标题】:How do I implement Server Sent Events in PHP?如何在 PHP 中实现服务器发送事件?
【发布时间】:2013-01-02 22:35:46
【问题描述】:

我已经使用 php 和一个 while 循环设置了一个服务器发送事件脚本,我不希望脚本必须继续关闭并且必须重新轮询,所以我将它全部放在一个 while 循环中。

问题是脚本卡住了,我不得不放弃那条路线,而是使用 node.js websocket 后端。

我的问题是,如果我回去制作服务器发送事件的 php 脚本,我该如何实现它?
while 循环似乎并没有削减它,因为它挂起脚本,如果它是只是每秒连接和断开连接,它与长轮询没有什么不同,那么如何创建一个不会挂起的 PHP 脚本,同时还通过 SSE 消息发送?

【问题讨论】:

标签: php server-sent-events


【解决方案1】:

您似乎对 php 输出缓冲有疑问。尝试将这些行添加到 while 循环的末尾:

ob_flush();
flush();

这应该禁用输出缓冲。

编辑您也可以在一段时间(即 10 分钟)后终止脚本以减少服务器负载。

我为您创建了一个库,以便您轻松完成。检查它here。

二次编辑 你有反向代理,比如 nginx 或 varnish 吗?这可能是因为代理尝试缓存输出的内容,但 SSE 脚本永远不会结束,直到您停止它,所以整个事情都挂起。捕获输出的其他事物可能具有类似的结果,例如 mod_deflate。

第三次修改 如果您有反向代理,可以尝试关闭缓存以允许 SSE 工作。

PHP 中还有另一种方法可以禁用输出缓冲。请看下面的代码:

<?php
for($i=0;$i<ob_get_level();$i++){
    ob_end_flush();
}
@apache_setenv('no-gzip',1);
@ini_set('implict_flush',1);
ob_implict_flush(true);

【讨论】:

猜你喜欢
  • 2012-02-16
  • 2023-02-17
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 2013-01-11
  • 2015-12-04
相关资源
最近更新 更多