是ob_start()
用於output buffering
這樣標題被緩衝而不發送到瀏覽器?我在這裏有意義嗎?如果不是,那我們爲什麼要用ob_start()
?在php中有什麼用ob_start()?
回答
想想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()
,它們要麼停止保存東西並丟棄所保存的內容,要麼分別停止保存並一次輸出。
此函數不僅用於標題。你可以用這個做很多有趣的事情。例如:你可以分割你的網頁到段,並使用它像這樣:
$someTemplate->selectSection('header');
echo 'This is the header.';
$someTemplate->selectSection('content');
echo 'This is some content.';
您可以捕捉在這裏生成的輸出,並在佈局兩個完全不同的地方添加它。
這種看起來像我在找的東西。我需要渲染'部分'的東西(想到JS和CSS文件),但我需要能夠在模板中調用它們(它比標題稍晚加載)...所以如果我調用「$ this - > addcss( 'specificCSStoThisView');」我希望它在
標籤之間進行渲染。但是,我似乎無法谷歌這一點。你能否指點我正確的方向?謝謝! – NoobishPro 2015-12-05 01:01:24你有它向後。 ob_start不緩衝標題,它緩衝內容。使用ob_start
可讓您將內容保留在服務器端緩衝區中,直到您準備好顯示它爲止。
這是常用的,以便頁面可以在'已經'發送'一些內容之後發送頭'(即,決定通過渲染頁面中途重定向)。
+1我也對這個函數的實際用法感到困惑。您在「重定向」期間對其使用的回答讓我想起了所有的時間,我有錯誤「Headers already sent」。謝謝 – pat 2014-02-02 19:40:37
不,你錯了,但方向符合;)
輸出緩衝緩衝的腳本的輸出。那(簡而言之)echo
或print
之後。標題是,他們只能發送,如果他們還沒有發送。但HTTP表示,標題是傳輸的第一個。所以如果你第一次輸出的東西(在請求中)頭部被髮送,你不能設置任何其他頭部。
我使用這個,所以我可以用大量的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>';
?>
這是進一步明確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>
這裏接受的答案描述了ob_start()
那樣 - 爲什麼不使用它(這是問的問題)。
如其他地方所述ob_start()
創建輸出寫入的緩衝區。
但沒有人提到可以在PHP中堆疊多個緩衝區。請參閱ob_get_level()。
至於爲什麼....
較大的塊發送HTML瀏覽器給出了降低網絡開銷性能優勢。
在較大的塊傳遞的數據從PHP的通過降低上下文的開關需要
傳遞較大的數據到MOD_GZIP的組塊的數目給出了一個性能和容量的益處/ mod_deflate模塊給出,所述壓縮性能益處可以更有效率。
緩衝輸出意味着可以仍然以後操縱的HTTP標頭中的代碼
明確輸出[頭]後在緩衝沖洗 .... [/頭]可以允許瀏覽器在HTML流完成之前開始封送頁面的其他資源。
捕獲在緩衝器中輸出意味着它可以重定向到其它功能,例如電子郵件,或複製文件,作爲所述內容的緩存表示
我更喜歡:
ob_start();
echo("Hello there!");
$output = ob_get_clean(); //Get current buffer contents and delete current output buffer
- 1. PHP ob_start()和ob_start( 'ob_gzhandler')
- 2. ob_start()在這裏的作用是什麼
- 3. 爲什麼ob_start()必須先於session_start()在PHP中工作?
- 4. 是我想用ob_start()做什麼?
- 5. 什麼可以用來代替ob_start(「ob_gzhandler」);
- 6. 爲什麼有人會以這種方式使用ob_start,這有什麼意義?
- 7. PHP ob_start()問題
- 8. php中的ob_start函數有問題
- 9. php - ob_start/fputs突然不起作用了,有什麼可以阻止它嗎?
- 10. C有沒有像PHP ob_start的東西?
- 11. PHP我應該在ob_start後使用ob_clean
- 12. ob_start和ob_gzhandler函數真的做什麼
- 13. 爲什麼ob_start()解決了header()錯誤?
- 14. 在ob_start()中使用include()
- 15. ob_start()沒有ob_flush()
- 16. 在PHP中輸出HTML,使用ob_start或簡單地echo $ html有什麼好處嗎?
- 17. 在PHP中,$ {$}語法有什麼作用?
- 18. Composer.phar在php中有什麼用?
- 19. 在php中@ Label有什麼用?
- 20. ob_start()之後包含,什麼也沒有發生
- 21. PHP ob_start(「ob_gzhandler」)與ob_clean錯誤
- 22. PHP:<<< VS ob_start
- 23. PHP性能:gzcompress()vs ob_start('ob_gzhandler')
- 24. PHP ob_start和session_start問題?
- 25. PHP OB_START哪個雙引號
- 26. PHP輸出緩衝(ob_start,ob_flush)
- 27. PHP ob_start()用於文件緩存
- 28. ob_start()PHP中模板的替代方法?
- 29. 如何使用ob_start在PHP中的標題位置重定向?
- 30. 替代<?php ob_start(); ?> .. <?php ob_flush(); ?>
很好的解釋。我會更進一步,並用`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
我假設輸出緩衝必須以.ini文件順序啓用調用`ob_start();`這是正確的嗎?如果未啓用會發生什麼情況? – 2015-08-14 03:48:00