一尘不染

即使在Nginx中也可以使用PHP Flush

php

是否可以在每次执行循环时回显?例如:

foreach(range(1,9) as $n){
    echo $n."\n";
    sleep(1);
}

我不想看到循环结束时打印所有内容,而是希望它每次都打印每个结果。


阅读 309

收藏
2020-05-29

共1个答案

一尘不染

最终解决方案

这就是我发现的:

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

  • 在php.ini中:

。output_buffering =关

。zlib.output_compression =关闭

  • 在nginx.conf中:

。gzip关闭;

。proxy_buffering关闭;

还要准备以下这行代码,特别是在您没有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);
}
2020-05-29