PHP缓冲区ob_flush()与flush()

时间:2010-11-16 05:10:48

标签: php flush output-buffering

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

ob_flush() reference说:

  

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

flush() reference说:

  

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

然而,它继续说:

  

[它]可能无法覆盖您的网络服务器的缓冲方案......

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

4 个答案:

答案 0 :(得分:70)

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

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

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

无论如何,同时使用两者。

答案 1 :(得分:31)

ob_flush刷新使用ob_start

等函数创建的输出缓冲区

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

答案 2 :(得分:22)

ob_flush()是一个高级同花顺。它刷新高级缓冲区并将所有内容放入低级内部缓冲区中,以便发送。

  • 请注意,ob_系列函数会创建缓冲区的堆栈,所以只要盲目地在任何地方写ob_flush(),如果代码是真的会给你“奇怪的结果”为利用这种堆叠而写的。

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

在那之下,还会有套接字层缓冲区;在此之下,有网络层缓冲区。并且,在最低级别,电子队列沿着数据线传输。

答案 3 :(得分:11)

我想这与你的previous question有关。使用输出缓冲的显着优势在于它与数据压缩一起使用。如果您没有使用ob_gzhandler,则无法获得收益。仅flush将只提交仍在服务器上的任何输出数据。使用ob_start及其对应的ob_flushob_end_cleanob_end_flush,等待压缩的内容(请flushob_flush查看不同的存储分区 - ob将数据发送到flushflush向浏览器发送数据 - 可能不准确,但这就是想法)将被包装并发送给客户端。