20

我们有类似这样的代码:

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

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

在 Apache 中,这会将每个回显发送到浏览器,因为它是输出的。然而,在 nginx/FastCGI 中,由于 nginx 的工作方式(默认情况下),这不起作用。

是否可以在 nginx/FastCGI 上进行这项工作,如果可以,如何?

4

6 回答 6

33

首先 php 必须正确刷新所有内容:

@ob_end_flush();
@flush();

然后,我找到了两个可行的解决方案:

1) 通过 Nginx 配置:

fastcgi_buffering off;

2) 通过 php 代码中的 HTTP 标头

header('X-Accel-Buffering: no');
于 2014-07-29T14:04:49.770 回答
5

简单的解决方案:

fastcgi_keep_conn on; # < solution

proxy_buffering off;
gzip off;
于 2012-11-30T09:28:43.353 回答
3

我不想关闭整个服务器或整个目录的 gzip,只是为了几个脚本,在一些特定情况下。

在任何内容被回显之前,您所需要的就是这个:

header('Content-Encoding: none;');

然后像往常一样进行冲洗:

ob_end_flush();
flush();

Nginx 似乎接受了已关闭的编码并且没有 gzip。

于 2013-06-27T10:13:36.687 回答
0

在循环中添加 flush() 函数:

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

它可能有效,但不一定在每次迭代中都有效(其中涉及一些魔法!)

于 2012-08-28T19:20:42.840 回答
0

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

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

单独的每一行也可以工作,将它们结合起来可以让我的浏览器更快地从服务器获取结果。无法解释,只是经历过。

我的配置是带有 php-fpm 的 nginx。

于 2019-09-19T11:06:46.010 回答