我们的代码类似于:
<?php
ob_implicit_flush(true);
ob_end_flush();
foreach ($arrayOfStrings as $string) {
echo time_expensive_function($string);
}
?>
在Apache中,这会在输出时将每个echo发送到浏览器。但是在nginx / FastCGI中,由于nginx的工作原理(默认情况下),这不起作用。
是否有可能在nginx / FastCGI上运行,如果是,怎么做?
答案 0 :(得分:24)
上述解决方案均不适合我。
首先,php必须正确刷新所有内容:
@ob_end_flush();
@flush();
然后,我找到了两个有效的解决方案:
1)通过Nginx配置:
fastcgi_buffering off;
2)通过php代码中的HTTP标头
header('X-Accel-Buffering: no');
答案 1 :(得分:4)
简易解决方案:
fastcgi_keep_conn on; # < solution
proxy_buffering off;
gzip off;
答案 2 :(得分:2)
在一些特定情况下,我不想为整个服务器或整个目录关闭gzip,仅针对几个脚本。
所有你需要的就是在回声之前:
header('Content-Encoding: none;');
然后正常进行冲洗:
ob_end_flush();
flush();
Nginx似乎已经关闭了已关闭的编码,并且没有gzip。
答案 3 :(得分:0)
在循环中添加flush()函数:
foreach ($arrayOfStrings as $string) {
echo time_expensive_function($string);
flush();
}
它可能有效,但不一定在每次迭代中(涉及一些魔法!)
答案 4 :(得分:0)
将-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
答案 5 :(得分:0)
在脚本的开头,我需要这两行代码:
header('X-Accel-Buffering: no');
ob_implicit_flush(true);
每行也可以使用,将它们组合在一起可使我的浏览器从服务器获得结果的速度更快。无法解释,只是经历过。
我的配置是使用php-fpm的nginx。