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

时间:2017-05-20 22:56:59

标签: php apache server-sent-events

我使用Ubuntu 17.04,Apache 2.4,proxy_fcgi和php-fpm。除了刷新服务器发送事件外,一切正常并且连接良好。

Flushing曾经与mod_fastcgi和fastcgiexternalserver很好地配合使用“-flush”。现在使用Ubuntu 17.04,它不包含mod_fastcgi,建议使用proxy_fcgi。

使用proxy_fcgi我已禁用gzip,输出缓冲,使用“Content-Encoding:none”,connection_aborted和flush工作的唯一真正方法是,如果你发送大约32K(我猜这是因为代理缓冲?)

它在Apache Docs中说你不能将ProxyReceiveBufferSize或ProxyIOBufferSize设置为小于512.

使用proxy_fcgi确实应该有一种更简单的方法。

发送服务器已发送事件数据的示例代码:

while (!connection_aborted() ) {
  echo('data: {}' . PHP_EOL . PHP_EOL);
  flush();
} // While //

编辑:我也尝试了ob_flush(),但我之前用ob_end_clean()禁用了输出缓冲(ob_ *),而ob_flush()将返回错误。

1 个答案:

答案 0 :(得分:0)

尽管这个问题是几年前提出的,但我还是遇到了Apache 2.4和public static IMessageBus CreateBusAndRegisterQueueConsumer<T>(string servicePath, string queueName, IComponentContext autoFacContext) where T : class { return new MessageBus { Instance = Bus.Factory.CreateUsingAzureServiceBus( sbc => { var host = ConfigureServiceBus(servicePath, sbc); sbc.ReceiveEndpoint(host, queueName, ec => { ec.Consumer<CommandConsumer<T>>(autoFacContext); }); }) }; } 的类似问题。 PHP应用程序确实直接返回了数据而没有缓冲(已通过内部服务器mod_fcgid测试)-但是在与Apache一起使用时已被缓冲。

以下配置为php -S 0.0.0.0:8080 index.php禁用输出缓冲(默认大小为65536字节)

mod_fcgid

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