2008-11-15 33 views
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>'; 
} 

哪个更好?

+0

最近我一直在想这个。不知道答案,但我知道你错过了“echo $ test”;对后者... – da5id 2008-11-15 03:22:54

+0

第一个不会回显变量。只需将整个echo'd部分放入$ test。如果你喜欢,也可以投票:) – 2008-11-15 03:28:42

回答

6

输出缓冲区具有全局变量的所有缺陷。您必须注意从ob_start()ob_get_clean()的所有执行路径。你确定它会到达那里,并且之间打开的任何缓冲区都将被关闭?请记住,代码可能会引发异常。这对于追踪下一个人来说可能是一个非常有趣的错误。另一方面 - 我讨厌甚至提到它 - 同时,由于PHP内部原因,输出缓冲在串联大型字符串方面稍微快一些。我不确定这是否仍然如此。

6

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

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

+0

在ob_get_contents vs ob_get_clean上的良好调用。已更改 – 2008-11-15 03:27:58

2

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

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

ob_start(); 

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

$test = ob_get_clean(); 
2

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

你也可以考虑使用内联HTML(甚至更快)。内联HTML增加的好处是您的IDE可能在HTML上执行语法高亮显示,当HTML位于PHP字符串内时不会发生这种情况。修改后的代码(项short_open_tags =在必填项):

ob_start(); 
?> 

<? foreach($items as $item) { ?> 
    <div><?= $item ?></div> 
<? } ?> 

<? 
$test = ob_get_clean(); 
4

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

回声“<格>” $测试。'</div >';

是可测量地比这慢:

回声 '<DIV>',$测试, '< /格>';

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

相关问题