我最后一次看到了很多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>';
}
哪个更好?
答案 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();