我们有类似的代码:
<?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();
}
它可能有效,但不一定在每次迭代中都有效(其中涉及一些魔术!)
将-flash添加到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
我在脚本的开头需要这两行:
header('X-Accel-Buffering: no');
ob_implicit_flush(true);
单独的每一行也可以工作,将它们组合在一起可以使我的浏览器更快地从服务器上获得结果。无法解释,只是经历过而已。
我的配置是使用php-fpm的nginx。