PHP Flush有效......即使在Nginx中也是如此

Rog*_*ger 28 php flush nginx

每次循环执行时都可以回显吗?例如:

foreach(range(1,9) as $n){
    echo $n."\n";
    sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

我不想在循环结束时打印所有内容,而是希望每次打印每个结果.

小智 38

消除nginx缓冲的最简单方法是发送标头:

header('X-Accel-Buffering: no');
Run Code Online (Sandbox Code Playgroud)

这消除了双方proxy_buffering和(如果你有nginx的> = 1.5.6) fastcgi_buffering.如果你使用php-fpm,fastcgi位是至关重要的.根据需要,标题也更方便.

关于fastcgi_buffering的X-Accel-Buffering 文档的文档


Rog*_*ger 34

最终解决方案

这就是我发现的:

Flush在Apache的mod_gzip或Nginx的gzip下不起作用,因为从逻辑上讲,它正在压缩内容,为此,它必须缓冲内容以对其进行gzip.任何类型的Web服务器gzipping都会影响这一点.简而言之,在服务器端,我们需要禁用gzip并减少fastcgi缓冲区大小.所以:

  • 在php.ini中:

    .output_buffering =关闭

    .zlib.output_compression =关闭

  • 在nginx.conf中:

    .gzip off;

    .proxy_buffering off;

也有这些线,特别是如果你没有访问php.ini:

  • @ini_set( '要用zlib.output_compression',0);

  • @ini_set( 'implicit_flush',1);

  • @ob_end_clean();

  • 参数或者set_time_limit(0);

最后,如果你有它,请在下面编写代码:

  • ob_start( 'ob_gzhandler');

  • 使用ob_flush();

PHP测试代码:

ob_implicit_flush(1);

for($i=0; $i<10; $i++){
    echo $i;

    //this is for the buffer achieve the minimum size in order to flush data
    echo str_repeat(' ',1024*64);

    sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

有关:


Ond*_*zka 26

在nginx服务器上轻松解决:

fastcgi_keep_conn on; # < solution

proxy_buffering off;
gzip off;
Run Code Online (Sandbox Code Playgroud)

  • 如果可以,我会给+2.在尝试了所有其他解决方案后,这是有效的. (3认同)
  • 同样,最好的答案在这里. (3认同)

Red*_*arf 10

在一些特定情况下,我不想为整个服务器或整个目录关闭gzip,仅针对几个脚本.

所有你需要的是在回声之前:

header('Content-Encoding: none;');
Run Code Online (Sandbox Code Playgroud)

然后正常进行刷新:

ob_end_flush();
flush();
Run Code Online (Sandbox Code Playgroud)

Nginx似乎已经关闭了已经关闭的编码并且没有gzip.


Pet*_*tah 5

您需要将php的缓冲区刷新到浏览器

foreach(range(1,9) as $n){
    echo $n."\n";
    flush();
    sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

请参阅:http://php.net/manual/en/function.flush.php