如何在nginxforphp应用程序中禁用输出缓冲


How to disable output buffering in nginx for PHP application

我们有类似的代码:

<?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。