我认为flush();
会起作用,至少从Google / Stackoverflow告诉我的情况来看,但是在我的Windows WAMP(Windows,Apache,MySQL,PHP)系统上它不起作用。
是否有一些PHP设置我必须设置为使flush()工作?
这是我的代码:
<?php
echo "Fun";
flush();
sleep(5);
echo "<br>Mo";
?>
当脚本完成执行时(5秒后),代码只输出所有内容..我不想要这个,我希望'Fun'立即显示,然后在5秒后'Mo'。< / p>
我已经尝试了其他类似的ob_end_flush();
or ob_implicit_flush(true);
的组合,但没有任何效果。有什么想法吗?
答案 0 :(得分:7)
这就是我发现的:
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);
}
答案 1 :(得分:5)
该脚本在CLI中正常工作,显示“Fun”,在显示“&lt; br&gt; Mo”之前等待5秒。
对于浏览器,结果可能会有所不同,因为:
要解决1)使用text / plain内容类型进行测试; 2)需要换行符,所以echo "Fun\n";
和echo "<br>Mo\n";
当然你不会使用text / plain来获取真实的HTML数据。
答案 2 :(得分:3)
如果您正在使用CGI / FastCGI,请忘掉它!这些不实现flush。 Web服务器可能拥有自己的缓冲区。
您可以使用以下命令禁用PHP中的所有输出缓冲:
ob_implicit_flush();
答案 3 :(得分:1)
如果问题仍然存在,尽管您明确设置了
implicit_flush = yes
在你的php.ini中,你可能还想设置
output_buffering = off
在我的情况下做了这个伎俩(把我的头发拉了4个小时后)
答案 4 :(得分:0)
检查你的php.ini是否为output_buffering
。
答案 5 :(得分:0)
也许这里的问题是Apache,它也可能有缓冲区......