PHP Flush,工作...甚至在Nginx
是否可以在每次执行循环时进行回显?例如:
foreach(range(1,9) as $n){
echo $n."\n";
sleep(1);
}
我希望看到它每次打印每个结果,而不是在循环完成后打印所有内容。
是否可以在每次执行循环时进行回显?例如:
foreach(range(1,9) as $n){
echo $n."\n";
sleep(1);
}
我希望看到它每次打印每个结果,而不是在循环完成后打印所有内容。
消除nginx缓冲的最简单方法是发出一个标头:
header('X-Accel-Buffering: no');
这消除了和(如果你有nginx>= 1.5.6)。。如果您使用的是php-fpm,fastcgi位至关重要。根据需要执行标头也更加方便。proxy_buffering
fastcgi_buffering
最终解决方案
这就是我发现的:
Flush在Apache的mod_gzip或Nginx的gzip下不起作用,因为从逻辑上讲,它是gzip内容,要做到这一点,它必须缓冲内容以gzip它。任何类型的Web服务器gzipping都会影响这一点。简而言之,在服务器端,我们需要禁用gzip并减小fastcgi缓冲区大小。所以:
在 php.ini 中:
.output_buffering = 关
.zlib.output_compression = 关
在nginx.conf中:
.gzip off;
.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);
}
相关: