【问题标题】:Is it better to use ob_get_contents() or $text .= 'test';使用 ob_get_contents() 或 $text .= 'test'; 更好吗?
【发布时间】:2010-09-22 11:12:35
【问题描述】:

我最近看到了很多ob_get_clean()。通常我已经完成了$test .= 'test'

我想知道一个是否比另一个更快和/或更好。

这是使用ob_get_clean()的代码:

ob_start();

foreach($items as $item) {
    echo '<div>' . $item . '</div>';
}

$test = ob_get_clean();

这是使用$test .= 'test'的代码:

$test = '';

foreach($items as $item) {
    $test .= '<div>' . $item . '</div>';
}

哪个更好?

【问题讨论】:

  • 我最近也一直在想这个。不知道答案,但我知道你错过了“echo $test;”关于后者...
  • 第一个不回显变量。只需将整个 echo'd out 部分放入 $test。如果您喜欢,请投票:)

标签: php optimization concatenation


【解决方案1】:

如果您担心字符串连接的开销,请注意:

echo '

'.$test.'
';

明显比这慢:

echo '

', $test , '
';

第一个编译成两个字符串 concat,然后是一个回显,而第二个编译成三个回显,实际上更快。

【讨论】:

    【解决方案2】:

    如上所述,输出缓冲对性能更好。对于大字符串,性能差异根本不可忽视。您可以将 PHP 中的输出缓冲与 Java 中的 StringBuffer/StringBuilder 进行比较;对于字符串连接,每次都需要将整个字符串复制到内存中。对于输出缓冲,文本进入一个以合理增量增长的缓冲区,无需为每个输出复制数据。

    您也可以考虑使用内联 HTML(甚至更快)。内联 HTML 的另一个好处是您的 IDE 可能会在 HTML 上执行语法突出显示,当 HTML 在 PHP 字符串中时不会发生这种情况。修改后的代码(short_open_tags = On required):

    ob_start();
    ?>
    
    <? foreach($items as $item) { ?>
        <div><?= $item ?></div>
    <? } ?>
    
    <?
    $test = ob_get_clean();
    

    【讨论】:

      【解决方案3】:

      我认为,当您使用大量字符串时,使用输出缓冲可能对性能有一点好处,但在我看来,对于一般用途,您最好使用串联,因为此代码可能更容易被其他人理解和调试。

      一个小点,但是如果你要使用输出缓冲的方法,你不妨充分利用它:

      ob_start();
      
      foreach($items as $item) {
          echo '<div>';
          echo $item;
          echo '</div>';
      }
      
      $test = ob_get_clean();
      

      【讨论】:

      • 嗯,是的,不知道。我没有做过任何测量。公平点
      【解决方案4】:

      输出缓冲区具有全局变量的所有缺陷。您必须了解从ob_start()ob_get_clean() 的所有执行路径。你确定它会到达那里,并且在两者之间打开的任何缓冲区都会被关闭吗?请记住,代码可能会引发异常。对于下一个人来说,这可能是一个非常有趣的错误。

      另一方面——我什至不想提它——由于 PHP 内部的原因,输出缓冲在连接大字符串时会更快一些。我不确定这是否仍然正确。

      【讨论】:

        【解决方案5】:

        结果是相同的,我想如果有的话,性能差异可以忽略不计。基本上,个人风格偏好的问题。我自己会使用串联 - 我仅在无法选择串联时才使用输出缓冲。

        另外,不要同时运行 ob_get_contents() 和 ob_clean(),只需运行 ob_get_clean() 即可同时执行。

        【讨论】:

        • 抱歉复活了一个 4 年前的帖子,但我偶然发现了它并想指出 ob_get_contents() 后跟 ob_clean()ob_get_clean() 并不完全相同。出于 OP 的目的,这可能没问题,但 ob_get_clean() 结束输出缓冲ob_get_contents()ob_clean() 则没有。根据手册,ob_get_clean() 与运行ob_get_contents() 后跟 ob_end_clean() 基本相同。
        猜你喜欢
        • 1970-01-01
        • 2017-01-19
        • 1970-01-01
        • 2020-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        相关资源
        最近更新 更多