如何在nginx中为PHP应用程序禁用输出缓冲

时间:2012-08-28 19:04:20

标签: php nginx fastcgi

我们的代码类似于:

<?php
    ob_implicit_flush(true);
    ob_end_flush();

    foreach ($arrayOfStrings as $string) {
        echo time_expensive_function($string);
    }
?>

在Apache中,这会在输出时将每个echo发送到浏览器。但是在nginx / FastCGI中,由于nginx的工作原理(默认情况下),这不起作用。

是否有可能在nginx / FastCGI上运行,如果是,怎么做?

6 个答案:

答案 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)

答案 5 :(得分:0)

在脚本的开头,我需要这两行代码:

header('X-Accel-Buffering: no');
ob_implicit_flush(true);

每行也可以使用,将它们组合在一起可使我的浏览器从服务器获得结果的速度更快。无法解释,只是经历过。

我的配置是使用php-fpm的nginx。