使用ob_get_contents()或$ text。='test'是否更好?

时间:2008-11-15 03:09:11

标签: php optimization concatenation

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

哪个更好?

5 个答案:

答案 0 :(得分:6)

结果是一样的,我认为性能差异可以忽略不计。基本上,个人风格偏好的问题。我会自己连接 - 只有当连接不是一个选项时才使用输出缓冲。

此外,不要同时运行ob_get_contents()和ob_clean(),而只需运行ob_get_clean(),它同时执行两个操作。

答案 1 :(得分:6)

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

另一方面 - 我讨厌甚至提及它 - 由于PHP的内部原因,输出缓冲在连接大字符串时有点快。我不确定这是否仍然存在。

答案 2 :(得分:4)

如果你担心字符串连接的开销,你应该注意这一点:

echo'&lt; div&gt;'。$ test。'&lt; / div&gt;';

明显慢于此:

echo'&lt; div&gt;',$ test,'&lt; / div&gt;';

第一个编译为两个字符串连接,后跟一个回声,而第二个编译为三个回声,这实际上更快。

答案 3 :(得分:2)

我认为使用输出缓冲在使用大量字符串时可能会有很小的性能优势,但是对于常见用途,我认为在串联中你会更好,因为这些代码可能更易于理解和调试。

一个小问题,但如果您打算使用输出缓冲方法,您可以完全使用它:

ob_start();

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

$test = ob_get_clean();

答案 4 :(得分: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();