在Nginx和php-fpm的环境中有办法立即输出缓存区内容的吗?

有如下代码:

for($i=1;$i<=10;$i++){
        echo json_encode(array('error'=>0,'msg'=>'这是测试的输出——'.$i));
        ob_flush();
        flush();
        sleep(1);
    }

按代码理解似乎应该是每过1秒钟,将输出一次json数据
而使用nginx作为web服务器时,会发现上面的代码,在程序运行10s后一次性输出了
php.ini中的output_buffering = 4096
后来又按网上说的尝试使用了ob_end_clean(); ob_implicit_flush(true);这些函数,但还是没有效果

阅读 4.6k
评论
    5 个回答

    在输出前先输出一个nginx特定的header:

    header('X-Accel-Buffering: no');

    这样无需设置什么gzip啊,缓存大小啊什么的
    官方文档

      • 243
      flush();
      ob_flush();
      

        WAMP下:

        for($i=1;$i<=10;$i++){
                echo str_pad(' ', 4096);
                echo json_encode(array('error'=>0,'msg'=>'这是测试的输出——'.$i));
                ob_flush();
                flush();
                sleep(1);
            }
        

        我试了试,这样是可以的。
        http://segmentfault.com/q/1010000000447596

        Ngnix下:
        关闭php.ini下的:zlib.output_compression = Off
        关闭nginx.conf下的:gzip off
        修改代码为echo str_pad(' ', 64000);

          function  test(){
              header("Content-Encoding: none\r\n");
              ini_set('zlib.output_compression', 'off');
              ob_start();
              for($i=0;$i<100;$i++){
                  echo str_repeat(" ",4096);
                  echo $i."<br>";
                  ob_flush();
                  flush();
                  sleep(1);
              }
          }
          
            • 1
            • 新人请关照

            经测试,楼上回答正确。 完美解决了nginx下无法flush的问题

            该答案已被忽略,原因:

              撰写回答

              登录后参与交流、获取后续更新提醒

              相似问题
              推荐文章