php flush无法正常工作

Spe*_*Wap 14 php flush

<?php
for($i=0;$i<20;$i++)
{
    echo 'printing...<br />';
    ob_flush();
    flush();

    usleep(300000);
}

?>
Run Code Online (Sandbox Code Playgroud)

包含以下代码的网址:http://domainsoutlook.com/sandbox/delayed.php

我有一个专用服务器,所以我可以进行更改.我正在运行apache和nginx作为代理服务器.

Rog*_*ger 39

这就是我发现的:

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)

  • 最后一件事"回应64k**毫无意义的**空白"为我做了诀窍.谢谢罗杰. (10认同)

小智 11

主要的php文件;

<?php
header('Content-Type: text/HTML; charset=utf-8');
header( 'Content-Encoding: none; ' );//disable apache compressed
session_start();
ob_end_flush();
ob_start();
set_time_limit(0);
error_reporting(0);

..... bla bla

for(each)........
{
   bla bla..
    echo "<br>>>>".$i."<<<br>";
    ob_flush();
    flush(); //ie working must

}
?>
Run Code Online (Sandbox Code Playgroud)

它正在工作..

  • 内容编码对我在 nginx 上有用 - 无需为整个服务器关闭它。谢谢艾敏! (2认同)
  • 设置`Content-Encoding'终于在Firefox上进行了刷新工作,但Chrome仍然期待压缩响应,因此它引发了一个`ERR_CONTENT_DECODING_FAILED`错误. (2认同)

sch*_*der 10

ob_flush没有使用ob_start,所以没有什么可以冲洗它.

它还取决于Web服务器和代理及其设置.

您应该为Nginx禁用缓冲(将"proxy_buffering off;"添加到配置文件并重新启动Nginx)

另外,检查你的php.ini是否包含"output_buffering = Off"和"zlib.output_compression = Off".

  • 我有proxy_buffering = off,zlib.output_compression = off和proxy_buffering off.但它仍然无法正常工作.请你指点一些代码或其他任何东西. (4认同)

Ank*_*rma 5

您必须填充缓冲区,以便将其刷新到浏览器。在 echo 之后使用这个

echo str_pad('',4096)."\n";
Run Code Online (Sandbox Code Playgroud)

完整代码:

<?php
     if (ob_get_level() == 0) ob_start();

     for( $i=0 ; $i<20 ; $i++) {
        echo 'printing...<br />';
        echo str_pad('',4096)."\n";

        ob_flush();
        flush();

        usleep(300000);
     }
     ob_end_flush();
?>
Run Code Online (Sandbox Code Playgroud)