14

我最近看到了很多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>';
}

哪个更好?

4

5 回答 5

6

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

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

于 2008-11-15T03:21:47.763 回答
6

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

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

于 2008-11-15T06:03:38.420 回答
4

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

echo '<div>'.$test.'</div>';

比这慢得多:

回声 '<div>', $test , '</div>';

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

于 2008-11-15T19:36:48.340 回答
2

我认为,当您使用大量字符串时,使用输出缓冲可能会带来很小的性能优势,但在我看来,对于常见用途,您最好使用连接,因为其他人可能更容易理解和调试此代码。

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

ob_start();

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

$test = ob_get_clean();
于 2008-11-15T14:31:09.317 回答
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();
于 2008-11-15T16:52:19.607 回答