PHP缓冲区ob_flush()与flush()

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

ob_flush()引用说:

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

flush()引用说:

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

但是,它继续说:

[它]可能无法覆盖您的Web服务器的缓冲scheme…

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

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

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

而现在Web服务器本身可能会实现另一个缓冲scheme( mod_deflate或内容filter),这是你没有影响的。 但这很less,因为它需要专门configuration。

无论如何,使用两者。

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

flush刷新PHP脚本本身的缓冲输出给它的调用者

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

  • 请注意,函数ob_家族创build堆栈的缓冲区,所以只要盲目地写ob_flush()到处都会给你“奇怪的结果”,如果代码被写入利用这种堆栈。

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

在这之下,还会有套接字层缓冲区。 在那之下,有networking层缓冲区。 而在最低的层面上,电子队列沿着数据电缆走下去。

我想这是关于你以前的问题 。 使用输出缓冲的重要优势在于它与数据压缩一起使用。 如果你不使用ob_gzhandler ,那么没有什么好处。 单独flush将只是提交输出数据仍然在服务器上。 使用ob_start及其对应的ob_flushob_end_cleanob_end_flush ,无论等待被压缩(看flushob_flush引用不同的桶 – ob发送数据到flushflush发送数据到浏览器 – 可能不准确,但这是想法)将被包装并发送给客户。