代码之家  ›  专栏  ›  技术社区  ›  Ben

php buffer ob_flush()与flush()之比较

  •  73
  • Ben  · 技术社区  · 14 年前

    有什么区别吗 ob_flush() flush() 我为什么要打两个电话?

    这个 ob_flush() reference 说:

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

    这个 flush() reference 说:

    刷新php的写缓冲区以及使用的后端php(cgi、web服务器等)。

    然而,它继续说:

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

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

    4 回复  |  直到 14 年前
        1
  •  70
  •   Wolverine fastcodejava    8 年前

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

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

    现在,Web服务器本身可能实现另一种缓冲方案。( mod_deflate 或者内容过滤器),这对您没有影响。但这很少,因为它需要专门配置。

    不管怎样,两者都用。

        2
  •  31
  •   Dan Grossman    14 年前

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

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

        3
  •  22
  •   Lightness Races in Orbit    13 年前

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

    • 注意, ob_ 功能系列创建 堆栈 缓冲区,所以只是盲目地写 对象刷新()) 如果代码是为了利用这种堆叠而编写的,那么每个地方都会给您带来“奇怪的结果”。

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

    在这之下,还有套接字层缓冲区;在那之下,有网络层缓冲区。在最底层,沿着数据线的电子队列。

        4
  •  11
  •   Community CDub    7 年前

    我想这和你的 previous question . 使用输出缓冲的显著优势在于它与数据压缩一起使用。如果你不使用 ob_gzhandler 没有什么可获得的。 flush 单独提交服务器上仍然存在的任何输出数据。用 ob_start 以及对应的 ob_flush , ob_end_clean ob_end_flush ,任何等待压缩的内容(看 脸红 OB冲洗 指不同的桶- ob 将数据发送到 脸红 , 脸红 将数据发送到浏览器-可能不准确,但这是个主意)将被打包并发送到客户机。