我见过很多 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>';
}

哪个更好?

有帮助吗?

解决方案

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

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

其他提示

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

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

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

echo'<!> lt; div <!> gt;'。$ test。'<!> lt; / div <!> gt;';

明显慢于此:

echo'<!> lt; div <!> gt;',$ test,'<!> lt; / div <!> gt;';

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

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

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

ob_start();

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

$test = ob_get_clean();

如上所述,输出缓冲对性能更好。对于大字符串,性能差异根本不可忽略。您可以将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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top