如何在PHP中实现服务器发送事件?

时间:2013-01-02 22:35:47

标签: php server-sent-events

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

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

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

1 个答案:

答案 0 :(得分:5)

你似乎在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);
相关问题