php - ob_implicit_flush - ob_start



PHP缓冲区ob_flush()与flush() (3)

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

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

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

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

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

ob_flush()引用说:

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

flush()引用说:

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

但是,它继续说:

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

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


Answer #1

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

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


Answer #2

我想这与你之前的问题有关 。 使用输出缓冲的显着优势在于它与数据压缩一起使用。 如果你没有使用ob_gzhandler ,那么几乎没有收获。 单独flush只会提交仍在服务器上的任何输出数据。 使用ob_start及其对应的ob_flushob_end_cleanob_end_flush ,等待压缩的任何内容(查看flushob_flush指向不同的桶 - ob将数据发送到flushflush将数据发送到浏览器 - 可能不准确,但这是个想法)将被包装并发送给客户。





output-buffering