【问题标题】:Output buffering vs. storing content into variable in PHP输出缓冲与将内容存储到 PHP 中的变量
【发布时间】:2013-01-26 15:51:00
【问题描述】:

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

关于这一点,不使用输出缓冲并将内容存储在我自己的局部变量中,而不是在脚本末尾回显它有什么区别?

输出缓冲示例:

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

以及不使用输出缓冲的例子:

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

有什么区别?

【问题讨论】:

    标签: php variables local-variables output-buffering


    【解决方案1】:

    主要区别:

    1.) 您可以使用“正常”输出语法,例如 echo 语句。你不必重写你的问题。

    2.) 您可以更好地控制缓冲,因为缓冲区可以堆叠。您不必了解命名约定等,这使得在编写和使用端彼此分开实现的情况下实现更容易。

    3.) 输出缓冲内容不需要额外的逻辑,您只需 flush。如果输出流是特殊的,则特别有趣。为什么要负担控制范围来处理这个问题?

    4.) 无论是否创建了输出缓冲区,您都可以使用相同的输出实现。这是一个透明度问题。

    5.) 你可以“抓住”不小心冒泡的东西,比如警告之类的东西,然后简单地吞下它。

    [...]

    【讨论】:

    • 另一个专业人士:您可以捕获第三方/本机代码的输出,当您不希望它输出内容时,例如肥皂服务器。 (抱歉,这就是 #2 所说的。)
    • 好的,我明白了。从内存的角度来看呢。哪个更好/最差?我应该缓冲整个页面还是部分页面?
    • 通常实际交付的标记页面的大小是如此之小,以至于考虑它是无趣的。在脚本执行期间,消耗内存的是不同的东西。所以缓冲与否以及如何缓冲的策略更多的是方便的问题:干净透明的实现应该是目标。
    • 当您必须在页面上加载大量内容时,例如来自数据库的文本字段,其中可能包含大量文本...... 怎么办?
    • 那将不是一个“典型的”标记页面......我想说只有你可以决定一个好的缓冲策略,因为只有你知道确切的细节......
    【解决方案2】:

    输出缓冲让您在分离what 到输出、when 到输出和如何 输出的关注点方面具有更大的灵活性,无需任何更改现有代码。

    您可能有现有的代码来回显其输出而不是返回它;输出缓冲允许该代码在不对其进行任何更改的情况下运行。

    除了明显的ob_end_flush() 之外,您还可以使用$output = ob_get_contents() 后跟ob_end_clean() 再次将输出捕获到变量中。这允许您将其写入文件而不是在屏幕上显示。

    最后,您可以将过滤器挂接到输出缓冲系统上,以实现即时压缩。

    另请参阅:ob_gz_handler

    【讨论】:

    • 好点。无论如何,如果您可以轻松地使用 Web 服务器(apache、nginx)来压缩内容,为什么还要有人用 PHP 压缩内容呢?
    • @BorutTomazin 压缩只是您可以通过输出缓冲完成的事情之一;您也可以进行文本重写。
    • 我不使用输出缓冲区函数,因为它有时会与应用程序的其他部分发生冲突(在 wordpress 中遇到过这种情况)。我更喜欢:stackoverflow.com/a/30821429/2377343
    • @T.Todua 我不喜欢使用 wordpress;您如何使用输出缓冲,以及如何在您控制较少的系统中使用它,最终将决定采用哪种策略。
    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 2023-03-22
    • 1970-01-01
    • 2015-09-20
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多