7

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

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

4

5 回答 5

5

我同意你最初的说法。通常,使用输出缓冲解决“标题”问题是权宜之计。

这个解决方案真正可悲/有趣的部分是:当你想输出大的东西时会发生什么,比如你保存在付费墙后面的文件?通常它会导致人们用他们的脚本内存不足来替换“标题”问题。

哎呀。

于 2010-05-27T08:40:37.123 回答
2

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

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

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

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

于 2010-05-27T08:58:19.677 回答
0

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

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

于 2010-05-27T08:51:17.680 回答
0

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

于 2010-05-27T09:19:57.703 回答
0

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

但是,我不得不同意你的看法:

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

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

C。

于 2010-05-27T12:06:32.740 回答