2010-12-09 31 views

回答

326

想想ob_start()這樣說:「開始記住通常會輸出的所有東西,但是現在還沒有做任何事情。」

例如:

ob_start(); 
echo("Hello there!"); //would normally get printed to the screen/output to browser 
$output = ob_get_contents(); 
ob_end_clean(); 

有您通常與其配對的另外兩個函數:ob_get_contents(),基本上給你任何已被「解救」到緩衝區,因爲它是開啓與ob_start(),然後ob_end_clean()ob_flush(),它們要麼停止保存東西並丟棄所保存的內容,要麼分別停止保存並一次輸出。

+33

很好的解釋。我會更進一步,並用`ob_get_clean()`替換`ob_get_contents()`,並移除`ob_end_clean()`,因爲`ob_get_clean()`實質上執行了兩個函數。參考:http://php.net/manual/en/function.ob-get-clean.php(PHP 4> = 4.3.0,PHP 5) – 2015-05-20 16:49:22

+0

我假設輸出緩衝必須以.ini文件順序啓用調用`ob_start();`這是正確的嗎?如果未啓用會發生什麼情況? – 2015-08-14 03:48:00

3

此函數不僅用於標題。你可以用這個做很多有趣的事情。例如:你可以分割你的網頁到段,並使用它像這樣:

$someTemplate->selectSection('header'); 
echo 'This is the header.'; 

$someTemplate->selectSection('content'); 
echo 'This is some content.'; 

您可以捕捉在這裏生成的輸出,並在佈局兩個完全不同的地方添加它。

+0

這種看起來像我在找的東西。我需要渲染'部分'的東西(想到JS和CSS文件),但我需要能夠在模板中調用它們(它比標題稍晚加載)...所以如果我調用「$ this - > addcss( 'specificCSStoThisView');」我希望它在標籤之間進行渲染。但是,我似乎無法谷歌這一點。你能否指點我正確的方向?謝謝! – NoobishPro 2015-12-05 01:01:24

28

你有它向後。 ob_start不緩衝標題,它緩衝內容。使用ob_start可讓您將內容保留在服務器端緩衝區中,直到您準備好顯示它爲止。

這是常用的,以便頁面可以在'已經'發送'一些內容之後發送頭'(即,決定通過渲染頁面中途重定向)。

+3

+1我也對這個函數的實際用法感到困惑。您在「重定向」期間對其使用的回答讓我想起了所有的時間,我有錯誤「Headers already sent」。謝謝 – pat 2014-02-02 19:40:37

0

不,你錯了,但方向符合;)

輸出緩衝緩衝的腳本的輸出。那(簡而言之)echoprint之後。標題是,他們只能發送,如果他們還沒有發送。但HTTP表示,標題是傳輸的第一個。所以如果你第一次輸出的東西(在請求中)頭部被髮送,你不能設置任何其他頭部。

109

我使用這個,所以我可以用大量的HTML來打破PHP但不能呈現它。它使我無法將其存儲爲禁用顏色編碼的字符串。

<?php 
ob_start(); 
?> 
<div> 
    <span>text</span> 
    <a href="#">link</a> 
</div> 
<?php 
$content = ob_get_clean(); 
?> 

相反的:

<?php 
$content = '<div> 
    <span>text</span> 
    <a href="#">link</a> 
</div>'; 
?> 
7

這是進一步明確JD Isaaks答案...

你遇到經常的問題是,你正在使用PHP輸出HTML從許多不同的PHP的資源,而且這些資源往往是出於任何原因通過不同的方式輸出。

有時你有直接輸出到瀏覽器的文字html內容;其他時間輸出是動態創建的(服務器端)。

動態內容始終是(?)將是一個字符串。現在你必須將這個字符串化的動態html與任何直接顯示html的文字結合成一個有意義的html節點結構。

這通常會迫使開發人員將所有直接顯示內容封裝到字符串中(如JD Isaak所討論的),以便它可以與動態html一起正確傳遞/插入......即使您不是真的想要它包裹。

但通過使用ob _ ##方法,您可以避免該字符串包裝混亂。而文字內容則輸出到緩衝區。然後在一個簡單的步驟中將緩衝區的全部內容(所有文字html)連接到您的dynamic-html字符串中。 (我的例子顯示輸出到緩衝區的文字html,然後將其添加到html字符串中...另請參閱JD Isaaks示例以查看html的字符串包裝)。

<?php // parent.php 

//--------------------------------- 
$lvs_html = "" ; 

$lvs_html .= "<div>html</div>" ; 
$lvs_html .= gf_component_assembler__without_ob() ; 
$lvs_html .= "<div>more html</div>" ; 

$lvs_html .= "----<br/>" ; 

$lvs_html .= "<div>html</div>" ; 
$lvs_html .= gf_component_assembler__with_ob() ; 
$lvs_html .= "<div>more html</div>" ; 

echo $lvs_html ;  
// 02 - component contents 
// html 
// 01 - component header 
// 03 - component footer 
// more html 
// ---- 
// html 
// 01 - component header 
// 02 - component contents 
// 03 - component footer 
// more html 

//--------------------------------- 
function gf_component_assembler__without_ob() 
    { 
    $lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ; 
    include("component_contents.php") ; 
    $lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ; 

    return $lvs_html ; 
    } ; 

//--------------------------------- 
function gf_component_assembler__with_ob() 
    { 
    $lvs_html = "<div>01 - component header</div>" ; // <table ><tr>" ; 

     ob_start(); 
     include("component_contents.php") ; 
    $lvs_html .= ob_get_clean(); 

    $lvs_html .= "<div>03 - component footer</div>" ; // </tr></table>" ; 

    return $lvs_html ; 
    } ; 

//--------------------------------- 
?> 

<!-- component_contents.php --> 
    <div> 
    02 - component contents 
    </div> 
58

這裏接受的答案描述了ob_start()那樣 - 爲什麼不使用它(這是問的問題)。

如其他地方所述ob_start()創建輸出寫入的緩衝區。

但沒有人提到可以在PHP中堆疊多個緩衝區。請參閱ob_get_level()。

至於爲什麼....

  1. 較大的塊發送HTML瀏覽器給出了降低網絡開銷性能優勢。

  2. 在較大的塊傳遞的數據從PHP的通過降低上下文的開關需要

  3. 傳遞較大的數據到MOD_GZIP的組塊的數目給出了一個性能和容量的益處/ mod_deflate模塊給出,所述壓縮性能益處可以更有效率。

  4. 緩衝輸出意味着可以仍然以後操縱的HTTP標頭中的代碼

  5. 明確輸出[頭]後在緩衝沖洗 .... [/頭]可以允許瀏覽器在HTML流完成之前開始封送頁面的其他資源。

  6. 捕獲在緩衝器中輸出意味着它可以重定向到其它功能,例如電子郵件,或複製文件,作爲所述內容的緩存表示

7

我更喜歡:

ob_start(); 
echo("Hello there!"); 
$output = ob_get_clean(); //Get current buffer contents and delete current output buffer 
相關問題