2008-11-15 30 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>',$測試, '< /格>';

第一個編譯爲兩個字符串連接後跟一個回聲,而第二個編譯爲三個回聲,這實際上更快。

相關問題