用于输出缓冲的用例是“已发送标头”的正确解决方案

时间:2010-05-27 08:34:02

标签: php output-buffering

我看到(不仅仅是在这个网站上)很多问题来自没有经验的PHP程序员关于臭名昭着的“标题已经发送...输出开始于”错误,很多人建议使用输出缓冲作为解决方案。

根据我的经验,我从未发现错误不是由程序逻辑中的缺陷引起的。是否存在输出缓冲实际上是正确解决方案的情况?

5 个答案:

答案 0 :(得分:4)

我同意你的初步陈述。通常,解决输出缓冲的“头”问题是权宜之计。

这个解决方案真正令人伤心/有趣的部分是:当你想要输出大的东西时会发生什么,例如你在付费墙后面的文件?通常它会导致人们用脚本耗尽内存来替换“头”问题。

糟糕。

答案 1 :(得分:2)

我能想象的唯一情况是CMS或Weblog,其中可以在HTML代码中调用插件,例如

<h1>My images</h1>
{plugin:show_images}

这些插件可能必须添加自己的样式表以及页面<head>部分中的其他内容。使用缓冲,这是可能的。

在实践中,这对性能不利,感觉很糟糕,并且在关闭输出缓冲时不起作用。即使在这里,最好在显示内容之前对内容进行预处理,并在输出任何内容之前添加样式表等。

答案 2 :(得分:0)

对于模板系统,您需要ob_start ... look和Zend_View

稍后编辑 我误解了这个问题,并提供了ob_start使用是一个有效解决方案的案例。

答案 3 :(得分:0)

您可能希望在流程后期发布HTTP重定向,例如在模板或异常处理中。 (当然,具有模板化或全局异常处理的框架无论如何都需要输出缓冲,所以你可以说它不是特定的解决方案。)

答案 4 :(得分:0)

  

根据我的经验,我从未发现错误不是由程序逻辑中的流程引起的。是否存在输出缓冲实际上是正确解决方案的情况?

但是我必须同意你的意见:

1)我喜欢PHP的一个原因是因为它可以让你选择如何解决问题

2)除了修复“已发送的标题”消息之外,还有其他用于output_buffering的用途 - 例如压缩输出,捕获任意代码的输出,避免分块编码......

下进行。