我已经设置了一个带有php和while循环的服务器发送事件脚本,我不希望脚本必须继续关闭并且必须重新播放所以我把它全部放在while循环中。
问题是脚本卡住了,我不得不放弃那条路线,而是选择了node.js websocket后端。
我的问题是,如果我回到制作服务器发送事件php脚本,我该如何实现呢?
while
循环似乎不会因为它挂起脚本而削减它,如果它只是连接和断开每秒,它与长轮询没有什么不同,那么如何创建一个不会挂起的PHP脚本,同时还发送了SSE消息?
答案 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);