PHP中的输出缓冲与将内容存储到变量中的区别

6

我不确定输出缓冲是如何工作的,但据我所知,它会将内容存储到一些内部变量中。

关于这个问题,如果不使用输出缓冲,而是将内容存储在本地变量中,最后再用echo输出是否有什么区别呢?

以下是使用输出缓冲的示例:

<?php
  ob_start();
  echo "html page goes here";
  ob_end_flush();
?>

一个不使用输出缓存的示例:

<?php
  $html = "html page goes here";
  echo $html;
?>

有什么不同之处?

2个回答

6
主要区别:
1.)您可以使用“正常”的输出语法,例如echo语句。您不必重写问题。
2.)您可以更好地控制缓冲,因为缓冲区可以堆叠。您不必了解命名约定之类的内容,这使得在编写和使用方面实现分离的实现更加容易。
3.)无需其他逻辑即可输出缓冲内容,只需flush即可。特别是如果输出流是某些特殊的东西,则为什么要让控制范围处理它呢?
4.)您可以在创建输出缓冲区后使用相同的输出实现。这是一个透明度问题。
5.)您可以“捕获”意外泡出的警告之类的东西,然后简单地将其吞下。

另一个优点是,您可以捕获第三方/本地代码的输出内容,即使您不希望它输出,例如SoapServer。(抱歉,这有点像#2所说的。) - cmbuckley
好的,我明白了。从内存角度来看呢?哪个更好/更差?我应该缓冲整个页面还是其中的一部分? - Borut Tomazin
通常,实际传递的标记页的大小非常小,因此考虑它是无趣的。在脚本执行期间,消耗内存的是不同的事情。因此,缓冲或不缓冲以及如何缓冲的策略更多地是一个方便问题:清晰透明的实现应该是目标。 - arkascha
当您需要在页面上加载大量内容时,例如从数据库中加载文本字段,这些字段可能包含大量文本时,该怎么办? - Borut Tomazin
那将不是一个“典型”的标记页...我会说只有您可以决定一个好的缓冲策略,因为只有您了解确切的细节... - arkascha

6
输出缓冲使您更灵活地分离输出的内容、输出的时间以及如何输出,而无需对现有代码进行任何更改。
您可能已经有了一个直接回显其输出而不是返回它的代码;输出缓冲允许这些代码在不做任何更改的情况下运行。
除了明显的 ob_end_flush(),您还可以使用 $output = ob_get_contents() 其次是 ob_end_clean() 将输出捕获到变量中。这使您可以将其写入文件而不是显示在屏幕上。
最后,您可以挂接过滤器到输出缓冲系统,实现即时压缩。
另请参见:ob_gz_handler

好观点。不过,如果可以轻松地使用Web服务器(Apache、Nginx)进行压缩,为什么还要使用PHP来压缩内容呢? - Borut Tomazin
压缩只是使用输出缓冲区可以完成的事情之一;您还可以进行文本重写。 - Ja͢ck
我不使用输出缓冲函数,因为它有时会与应用程序的其他部分发生冲突(在WordPress中遇到过这种情况)。我更喜欢:https://dev59.com/DHI-5IYBdhLWcg3w-92b#30821429 - T.Todua
@T.Todua和我都不喜欢使用WordPress;如何使用输出缓冲以及它在你控制较少的系统中的使用方式,最终将决定采用哪种策略。 - Ja͢ck

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