10

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

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

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

4

1 回答 1

5

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

ob_flush();
flush();

这应该禁用输出缓冲。

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

我为您创建了一个库,以便您轻松完成。在这里检查。

第二次编辑 您是否有反向代理,例如 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);
于 2013-01-02T23:04:41.597 回答