ob_flush()
和flush()
之间有什么区别?为什么我必须同时调用它们?
此函数将发送输出缓冲区的内容(如果有)。
刷新PHP的写缓冲区以及PHP正在使用的任何后端(CGI,Web服务器等)。
然而,它继续说:
[它]可能无法覆盖您的网络服务器的缓冲方案......
所以,在我看来,我可以一直使用ob_flush()
。但是,当我这样做时,我得到了奇怪的结果。有人可以用简单的语言解释这里发生了什么吗?
答案 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_flush
,ob_end_clean
和ob_end_flush
,等待压缩的内容(请flush
和ob_flush
查看不同的存储分区 - ob
将数据发送到flush
,flush
向浏览器发送数据 - 可能不准确,但这就是想法)将被包装并发送给客户端。