什么是ob_flush和ob_end_flush之间的区别?

时间:2011-09-08 22:40:50

标签: php output-buffering

我对PHP函数ob_flush()ob_end_flush()感到困惑。 关于ob_flush函数The buffer contents are discarded after ob_flush() is called.This function does not destroy the output buffer like ob_end_flush() does.

discarded

我对destroyedob_flush()这里的单词感到困惑。即使在ob_end_flush()的情况下丢弃了缓冲区内容,也无法访问它们,即使它们被销毁,如{{1}}的情况也无法访问它们。 那么这两个函数之间的差异是什么?

更新

回应manual我不明白删除缓冲区中的所有内容但保持缓冲区与删除整个缓冲区(释放它)的重要性,因为PHP没有指针的概念,你不能得到缓冲区的地址,所以你是否保留空缓冲区或者你是否释放它应该是无关紧要的

3 个答案:

答案 0 :(得分:19)

我认为在这种情况下他们的意思是一样的。当您要将页面的部分刷新到客户端时使用ob_flush(),而ob_end_flush()刷新整个缓冲区,然后销毁缓冲区。 ob_flush()所做的是删除缓冲区中的所有,但保留缓冲区本身,以便在ob_flush()调用后可以将更多数据放入其中。


我会试着更好地解释一下。

丢弃

假设我有一个漂亮,明亮的橙色塑料桶。这是我的缓冲区。然后我得到一些沙子,代表缓冲区的内容,并填满缓冲区(桶)。然后我用沙子挑选这个桶,然后将它倒入沙坑中,这是我的客户端。你会注意到沙子已经消失了,但水桶仍然存在。这就是the buffer contents are discarded的意思 - 缓冲区本身可以重复使用(再次填充沙子)。在内存方面,内存已清空但未释放,因此可以再次填充。

销毁

现在,如果我们再次拿起我们的桶,再次用沙子填满,将沙子清空,然后放火烧桶,因为我们不再需要它,这叫做破坏缓冲区< /强>; 缓冲区中的数据消失了,但缓冲区本身也是。在内存方面,内存可以用于其他用途。


OP请问,这在PHP中是否重要,没有指针?嗯,这取决于你想做什么。如果您正在处理长页面,并希望(例如)在完成页面的其余部分处理后将标题和侧边栏发送到客户端,请使用ob_flush()

如果您希望在客户端之后不再输出任何内容,请使用ob_end_flush()


我的意思绝对不是在以相当光顾的语气说话时不尊重;我想做一个类比,使定义尽可能清晰。

答案 1 :(得分:5)

ob_flush不会关闭输出缓冲

答案 2 :(得分:1)

ob_end_flush()显示缓冲区中的所有内容,然后销毁缓冲区。 ob_flush做同样的事情,但不会破坏缓冲区只是清除它。

ob_flush() =

ob_end_flush();
ob_start();