PHP缓冲区ob_flush()与flush()

Ben*_*Ben 76 php flush output-buffering

ob_flush()flush()两个人之间有什么区别?

ob_flush()参考说:

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

flush()参考说:

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

但是,它继续说:

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

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

mar*_*rio 73

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

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

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

无论如何,使用两者.

  • 这个答案中缺少的重要细节是[`output_buffering`](http://www.php.net/manual/en/outcontrol.configuration.php#ini.output-buffering)配置选项,其生产版本的默认值php.ini是4096.这意味着当任何PHP脚本启动时,前4096字节的输出被缓冲(在一个可用`ob_flush()`刷新的缓冲区中).这就是为什么有必要使用`ob_flush()`以及`flush()`.通过php.ini禁用`output_buffering`或在脚本开头调用`ob_end_clean()`或`ob_end_flush()`可以消除这种必要性. (16认同)
  • 使用ob_flush并刷新并按顺序使用它们. (11认同)

Dan*_*man 33

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

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


Lig*_*ica 24

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

  • 请注意,ob_函数族创建了缓冲区堆栈,因此,ob_flush()如果编写代码以利用此堆栈,那么盲目地在任何地方写入确实会给您"奇怪的结果".

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

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


bco*_*sca 11

我想这与你之前的问题有关.使用输出缓冲的显着优势在于它与数据压缩一起使用.如果你没有使用ob_gzhandler,那就没有什么好处了.flush单独将提交仍在服务器上的任何输出数据.随着ob_start它的对应物ob_flush,ob_end_clean以及ob_end_flush等待压缩的任何东西(查看flushob_flush引用不同的桶 - ob发送数据flush,flush向浏览器发送数据 - 可能不准确,但这就是想法)将被包装并发送给客户端.