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

标签 php apache server-sent-events

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

Flushing 过去常常与 mod_fastcgi 和带有“-flush”的 fastcgiexternalserver 一起很好地工作。现在使用 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() 将返回错误。

最佳答案

虽然这个问题几年前就有人提出过,但我只是遇到了 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

关于php - 使用 PHP 和服务器发送事件(使用 proxy_fcgi 刷新),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44091554/

相关文章:

c++ - APR(Apache 可移植运行时)1.3 和 0.9 之间有什么区别?

php - 如何在 HTTP/1.1 中使用 PHP cURL

PHP - 使用 PDO 从自定义类中获取对象

apache - 如何在集群中配置两台 jack 兔服务器?

php - Laravel Eloquent 的 Mysql 索引

php - 为 .NET/Windows 和 PHP/Linux/Apache 网站使用 OpenID

node.js - SSE(服务器发送事件),在 Node.js 服务器中监听事件并将其 POST 到其他服务器

应用程序关闭时 Android 推送通知不起作用

php - cakephp 保存数据到数据库

php - 如何使用 PHP 开发音乐流媒体网站