输出缓冲的优缺点是什么?

7

I have read on many websites that using

ob_start(); 

可以提高页面加载速度,因为它将PHP存储在变量中,一次性显示,而不是逐步处理PHP。

此外,它非常有用于

header('location: /');

有些人说这是意大利面条式代码,但只要代码对任何程序员来说都清晰简洁,那么这就不应该成为问题,对吧?

您对使用它有什么想法?您将输出缓冲设置为什么?在何时何地以及为什么我应该或不应该使用它方面有什么优缺点。


1
关于第二个问题部分:在所有PHP页面的开头使用"ob_start()"是否可以? - 如果它的目的只是为了防止已发送头错误,那么这被广泛认为是一种hack。但是,这是一个功能性的hack。只需注意可靠性取决于PHP是否隐式刷新(默认缓冲区大小可能取决于php.ini设置)。 - mario
2个回答

1
输出缓冲的主要优点是可以与ob_gzhandler一起使用,这将压缩输出,从而减少带宽使用。如果您的服务器未设置为发送压缩的php文件,则使用此功能非常好。
另一个优点是,如果您的脚本使用数据库或其他受限资源,并且在关闭连接或释放这些资源之前有一些输出。不必再像这样:
1. 连接到数据库 2. 开始向用户发送输出 3. 等待用户接收所有内容 4. 关闭数据库连接
您可以这样做:
1. 开始缓冲 2. 连接到数据库 3. 输出一些内容 4. 关闭数据库连接 5. 将缓冲发送给用户。
当您的脚本需要连接到数据库100毫秒,而用户需要300毫秒才能下载它时,您可以理解输出缓冲如何帮助释放数据库连接限制上的一些压力。
我知道使用良好配置的服务器编写的代码可以抵消这些优点,但您永远不知道谁会在您之后编写代码,也不总是控制其运行的服务器。

-1

一些用户不太了解 PHP,因此会错误地使用 ob_start。

如果您正在使用诸如 header()、cookie()、session 等头函数,则无需发送任何输出。这些函数必须在输出之前使用。

但是有些用户会使用 ob_start 或输出缓冲函数来停止发送输出。

因此,您可以使用 JavaScript 或 meta 转发来转发用户。

<script language="javascript"> window.location = 'some.php'; </script>

或者你可以使用元标记刷新来转发用户。

<META HTTP-EQUIV="Refresh" CONTENT="0;URL=some.php"> 

如果你真的需要使用header函数,你必须不发送任何输出(不要忘记换行符或空格也是输出,UTF-8签名也是)。

1
-1 - 使用 ob_start 作为防止输出被发送的方法并没有错。然而,通常情况下,这可能会影响性能,并意味着您的代码存在分层问题。 - Mathias Lykkegaard Lorenzen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接