【问题标题】:Switch from php-mod to php-fpm Output buffering problem从 php-mod 切换到 php-fpm 输出缓冲问题
【发布时间】:2019-06-19 04:47:54
【问题描述】:

当使用 php-mod 和 fastcgi 时,代码执行完美,每秒我都会得到一个输出,但切换到 php-fpm 代码会延迟几秒钟,然后根据输出大小输出

尝试了以下和组合 在 php ini 中设置输出缓冲区 0 ob_implicit_flush ob_start ob_end_flush 标头内容编码 = 无 隐式刷新 1 ob_end_clean

<?php
  header('Content-Type: text/event-stream');
  header('Cache-Control: no-cache');
  while( true ){
    $time = date('r');
    echo "retry:1000\r\n";
    echo "data: ".$time;
    echo "\r\n\r\n";                    
    ob_flush();
    flush();
    sleep(1);
   }
  ?>

这是用于生产服务器的,php-mod 不是一个选项,我也让它在 Fastcgi 中工作 FcgidOutputBufferSize 0 有没有办法让代码在 php-fpm 上运行,以便像 php-mod 和 fastcgi 一样立即发送输出?

PS 运行:Ubuntu 18.04、Apache 2.4.29、PHP 7.2

【问题讨论】:

    标签: php


    【解决方案1】:

    几天后,我发现让它在 php-fpm 中工作的唯一方法是填充输出缓冲区。这真是低效!让我解释一下:

    假设您正在使用服务器发送事件并且您的输出缓冲区是 4096,即使您没有返回任何内容,您仍然每秒处理一次,您仍然向客户端发送大约 4Kb 的输出,其中 mod_php 和 fast-cgi 仅在有数据时发送数据输出。

    如果其他人有这个问题,这是我最好的解决方案:在 php-fpm ex 上运行主站点。 example.com 并创建一个子域 ex。 push.example.com 并在子域上设置 fast-cgi / php_mod[NOT RECOMMENDED PRODUCTION] 现在您可以保持连接打开并处理数据而无需向客户端发送输出。

    PS。我将会话变量保存在数据库中,因此域和子域都可以访问它,请参阅https://github.com/dominicklee/PHP-MySQL-Sessions 另一件事是让子域发送 CORS。在 PHP 中添加 header('Access-Control-Allow-Origin: https://example.com');

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 2014-10-01
      • 2016-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多