使用PHP和服务器发送事件(通过proxy_fcgi刷新)

4
我使用Ubuntu 17.04、Apache 2.4、proxy_fcgi和php-fpm。除Server Sent Events的刷新外,其他一切工作正常并且连接良好。
使用mod_fastcgi和fastcgiexternalserver与“-flush”时,刷新可以正常工作。然而,在Ubuntu 17.04中,不包括mod_fastcgi,并且推荐使用proxy_fcgi。
使用proxy_fcgi时,我已禁用gzip、输出缓冲,使用“Content-Encoding: none”,唯一使connection_aborted和flush正常工作的方法是发送大约32K的数据(我猜这是因为代理缓冲?)。
在Apache文档中指出,不能将ProxyReceiveBufferSize或ProxyIOBufferSize设置小于512。
使用proxy_fcgi应该有更简单的方法来实现这一点。
以下是发送Server Sent Events数据的示例代码:
while (!connection_aborted() ) {
  echo('data: {}' . PHP_EOL . PHP_EOL);
  flush();
} // While //

编辑:我也尝试了ob_flush(),但是之前我使用了ob_end_clean()禁用了输出缓冲(ob_*),所以ob_flush()会返回一个错误。


除非涉及编程或编程工具,否则与专业服务器或网络基础架构管理有关的问题在Stack Overflow上不受支持。您可以在Server Fault 上获得帮助。 - Blue
这与PHP编程有关。抱歉我没有表明清楚,我应该包括无法正常工作的示例代码吗? - Raid
我怀疑这与你所说的禁用输出缓冲有关(我猜测这意味着PHP的输出缓冲),但你能否尝试在当前的flush()处使用ob_flush(); flush(); - Darren Cook
是的。我已经使用ob_end_clean()禁用了输出缓冲(ob)。当您调用ob_flush()时,如果它给出错误说没有缓冲区,那么您就知道它被禁用了。这可能只是mod_proxy_fcgi的一个错误?因为它可以在mod_fastcgi和“-flush”中工作。编辑:也许你们是对的,这可能不是PHP的问题了。我在另一个网站上读到过这个问题。我有点希望有人能够成功地使用Server Sent Events和PHP(与mod_proxy_fcgi一起),我认为这将有助于其他处于同样困境的人。 - Raid
https://dev59.com/2ZDea4cB1Zd3GeqPivBI#60219588 解释了我是如何使它对我工作的。简短的答案是:fastcgi_finish_request() - David
1个回答

1
尽管这个问题已经被问了几年,但我刚遇到了一个类似的问题,涉及Apache 2.4和mod_fcgid。PHP应用程序在不缓冲的情况下直接返回数据(使用内部服务器php -S 0.0.0.0:8080 index.php进行测试),但在与Apache一起使用时会被缓冲。
以下配置禁用了mod_fcgid的输出缓冲(默认大小为65536字节)。
FcgidOutputBufferSize 0

https://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#FcgidOutputBufferSize


是的,我相信在那个项目中我能够使用mod_fcgid完成它,但我需要使用“proxy_fcgi”(这是仍在缓冲的那个)。不过还是感谢你在这么长时间后加入讨论! - Raid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接