我们有这样的代码:
<?php ob_implicit_flush(true); ob_end_flush(); foreach ($arrayOfStrings as $string) { echo time_expensive_function($string); } ?>
在Apache中,这会在输出时将每个回显发送到浏览器。 然而,在nginx / FastCGI中,由于nginx的工作方式(默认),这是行不通的。
是否有可能使这个工作在nginx / FastCGI,如果是这样,如何?
上述解决方案都不适合我。
首先,PHP必须正确地刷新一切:
@ob_end_flush(); @flush();
然后,我发现了两个工作解决方案:
1)通过Nginx配置:
fastcgi_buffering off;
2)通过PHP代码中的HTTP头
header('X-Accel-Buffering: no');
简易解决方案
fastcgi_keep_conn on; # < solution proxy_buffering off; gzip off;
我不想关闭整个服务器或整个目录的gzip,只是为了几个脚本,在一些特定的情况下。
所有你需要的是这个之前什么是回声:
header('Content-Encoding: none;');
然后照常冲洗:
ob_end_flush(); flush();
Nginx似乎已经关闭了编码,而不是gzip。
在循环中添加flush()函数:
foreach ($arrayOfStrings as $string) { echo time_expensive_function($string); flush(); }
它可能会工作,但不一定每次迭代(有一些魔术参与!)
将-flush添加到FastCGI配置中,请参考手册:
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiserver
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiConfig
http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalserver
从http://mailman.fastcgi.com/pipermail/fastcgi-developers/2009-July/000286.html