【发布时间】:2011-01-10 00:36:29
【问题描述】:
我在 Internet 上阅读了很多资料,其中不同的作者建议使用输出缓冲。有趣的是,大多数作者只支持它的使用,因为它允许将响应标头与实际内容混合。坦率地说,我认为负责任的 Web 应用程序不应该混合输出标头和内容,Web 开发人员应该在其脚本中寻找可能导致标头在生成输出后发送的逻辑缺陷。这是我反对ob_* 输出缓冲API 的第一个论点。即使您获得的一点点便利——将标头与输出混合——也不是使用它的充分理由,除非需要快速破解脚本,这通常不是严肃的 Web 应用程序的目标,也不是方法。
另外,我认为大多数处理输出缓冲 API 的人并没有考虑这样一个事实,即即使没有启用显式输出缓冲,PHP 与它所插入的 Web 服务器相结合,仍然会做一些内部无论如何缓冲。很容易检查 - 对一些短字符串进行回显,休眠 10 秒,然后再进行回显。使用浏览器请求您的脚本并观察空白页暂停 10 秒钟,然后两行都出现。之前有人说它是渲染人工制品,而不是流量,跟踪客户端和服务器之间的实际流量表明服务器已经为整个输出生成了具有适当值的 Content-Length 标头 - 表明未发送输出随着每个echo 调用逐步进行,但在某个缓冲区中累积,然后在脚本终止时发送。这是我对显式输出缓冲的抱怨之一——为什么我们需要两个不同的输出缓冲实现?可能是因为内部(不可访问的)PHP/Web 服务器输出缓冲受到 PHP 开发人员无法控制的条件的影响,因此无法真正使用?
无论如何,我开始认为应该避免显式输出缓冲(ob_* 函数系列)并依赖隐式输出缓冲,必要时使用良好的flush 函数辅助它。也许如果 Web 服务器能保证每次 echo/print 调用时实际向客户端发送输出,那么设置显式缓冲会很有用——毕竟人们不想用大约 100 向客户端发送响应字节块。但是有两个缓冲区的替代方案似乎是一个有点无用的抽象层。
那么,最终,严肃的 Web 应用程序是否需要输出缓冲?
【问题讨论】:
-
我印象深刻,第一个答案大约在 3 分钟内出现。在被问到问题之后。这是一些快速阅读!
-
@Chacha102: 和@troelskn: 哇,互联网真的摧毁了你的阅读能力,不是吗?读起来真的不多。在我看来,“文字墙”并没有像断句这样的好东西。我不想给你们两个(和支持者)带来困难,但我们应该赞扬那些花时间详细阐述他们的问题而不是嘲笑他们的人。如果你的注意力这么短,为什么要回应?
-
我认为 Stack Overflow 是针对有答案的问题,而不是辩论...?
-
我写的可能有点太多了,你是对的。为了我的辩护,我会说我宁愿在一个问题中过度解释自己,也不愿在问题列表中发送一个过于模糊且需要澄清的问题。无论如何,Chacha102,对不起,你浪费了你生命中的2分钟。下次判断力好点,毕竟没人让你看我的文字墙。
-
@eyelid,鉴于我已经阅读了两遍,这可能说明我的注意力不集中。我并不是说该评论是贬义的,但显然您无法在互联网上发现讽刺或幽默。也许你发现幽默的能力已经被互联网破坏了。