从php-mod切换到php-fpm输出缓冲问题

时间:2019-06-19 04:47:54

标签: php

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

尝试了以下内容和组合 在PHP ini中设置输出缓冲区0 ob_implicit_flush ob_start ob_end_flush 标头Content-Encoding =无 hidden_​​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一样立即发送输出?

P.S运行:Ubuntu 18.04,Apache 2.4.29,PHP 7.2

1 个答案:

答案 0 :(得分:0)

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

假设您正在使用服务器发送事件,并且输出缓冲区为4096,即使不返回任何内容,您也将每秒处理一次,即使您仍向客户端发送4Kb输出,mod_php和fast-cgi仅在存在以下情况时才发送数据输出。

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

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