83

两者之间有什么区别ob_flush()flush()为什么我必须同时调用两者?

ob_flush()参考资料说:

此函数将发送输出缓冲区的内容(如果有)。

flush()参考资料说:

刷新 PHP 的写入缓冲区以及 PHP 正在使用的任何后端(CGI、Web 服务器等)。

然而,它继续说:

[它] 可能无法覆盖您的 Web 服务器的缓冲方案……</p>

所以,在我看来,我可以一直使用ob_flush()。但是,当我这样做时,我会得到奇怪的结果。有人可以简单地解释一下这里发生了什么吗?

4

4 回答 4

76

ob_flush发送一个应用程序启动的缓冲区。任何 PHP 脚本中都可能有多个嵌套ob_start()的 's。ob_flush将当前内容传递给上层。

PHP 本身可能(自行决定)缓冲输出。这取决于后端。但通常FastCGI它自己有一个套接字缓冲区。因此flush()也需要调用以将当前内容发送到 Web 服务器。

现在,Web 服务器本身可能会实现另一个缓冲方案(mod_deflate或内容过滤器),您对此没有任何影响。但这很少见,因为它需要专门配置。

无论如何,两者都用。

于 2010-11-16T05:18:54.110 回答
35

ob_flush刷新您使用类似函数创建的输出缓冲区ob_start

flush将 PHP 脚本本身的缓冲输出刷新到其调用者

于 2010-11-16T05:30:56.270 回答
26

ob_flush()是高级同花顺。它刷新高级缓冲区并将所有内容放入准备发送的低级内部缓冲区。

  • 请注意,ob_函数系列会创建缓冲区堆栈ob_flush(),因此如果编写代码是为了利用这种堆栈,那么盲目地到处写确实会给您带来“奇怪的结果”。

flush()是一个低级刷新,指示 PHP 刷新其内部的低级数据缓冲区。

在此之下,还会有套接字层缓冲区;在此之下,有网络层缓冲区。而且,在最低级别,电子队列沿着数据电缆向下移动。

于 2011-05-21T14:39:56.580 回答
12

我想这与你之前的问题有关。使用输出缓冲的显着优势在于它与数据压缩一起使用。如果您不使用ob_gzhandler,则几乎没有什么收获。flush单独将提交仍然在服务器上的任何输出数据。Withob_start和它的对应物ob_flush, ob_end_cleanand ob_end_flush, 任何等待被压缩的东西(看flushob_flush指代不同的桶 -ob将数据发送到flushflush将数据发送到浏览器 - 可能不准确,但这就是想法)将被打包并发送给客户端.

于 2010-11-16T05:49:06.983 回答