我在网上发现很少有文章建议使用ob_
函数,所有这些都强调好处,并且没有提到使用函数的缺点。
我的问题是使用ob_
函数或设置的缺点是什么ini_set('output_buffering', '1');
?
我在网上发现很少有文章建议使用ob_
函数,所有这些都强调好处,并且没有提到使用函数的缺点。
我的问题是使用ob_
函数或设置的缺点是什么ini_set('output_buffering', '1');
?
使用输出缓冲的缺点完全取决于您的使用环境。
输出缓冲的最大缺点之一是您的运行时错误消息或警告可能会被抑制,并且您有时可能会得到错误的数据。
考虑这个例子:
<?php
function render_template() {
ob_start();
// Do some processing
fetch_template_and_render();
do_render();
// end capture
$output = ob_get_clean();
return $output;
}
memchace::set( $some_key, render_template() );
?>
如果其中一个fetch_template_and_render
或do_render
抛出运行时错误,它们将被转储到您的输出中,最终在此示例中将最终出现在数据库或缓存中。
这里有 2 个片段展示了我的意思,您可以自己尝试一下
#1
<?php
echo 1/0;
?>
输出
Warning: Division by zero on line 1
#2
<?php
ob_start();
echo 1/0;
$var = ob_get_clean();
?>
什么都不输出。
为避免这种情况,您需要认真检查错误并采取预防措施。
如果用心使用,ob_* 函数非常强大且超级有用。
如果实施得当,使用输出缓冲没有大的缺点。
输出缓冲可以允许错误/警告/通知(停止错误除外)出现在输出中,而不会很明显。这通常通过适当的错误检查、更好的 php 环境配置和良好错误处理程序的实现来解决(例如将错误转换为ErrorExceptions
可以用 try/catch 捕获的错误处理程序 - 参见Whoops!作为错误处理程序的示例使用ErrorExceptions
)。
内存可能是一个缺点,但对于大多数脚本来说,输出大小通常是微不足道的。发送大量数据时可能是一个例外,例如fpassthru
用于传递文件内容。这可以通过在将此内容写入输出之前关闭输出缓冲(ob_end_clean 或 ob_end_flush)来解决。
内存消耗是最重要的缺点。我最近构建了一个 PHP 脚本,它输出大量几兆字节的 XML 数据。这个“页面”的框架是使用的输出缓冲的一部分。使用输出缓冲,您需要一个足够大的内存缓冲区来包含所有数据。就我而言,它不是,脚本失败了。
如果直接将数据输出到客户端,就没有这个问题。在这种情况下以及在处理文件时,这一点尤其重要。在生成“普通”HTML 页面的情况下,您可能不会用完整个缓冲区,但如果同时有许多请求,您仍然需要大量内存。
没有缓冲,数据就消失了,不再给你的服务器带来麻烦。只要数据被缓冲,就可以更改或刷新,但实际上会给您的服务器带来负载。
这是 ob_ 函数的一个很好的用途:
ob_start("ob_gzhandler");
如果在 PHP 中启用了 zlib 扩展,那么应该确保您的输出是 gz 压缩的。它显着加快了大页面的页面传输速度。