定義中應該提到,該函式也會「關閉輸出緩衝」,而不僅僅是清除它。
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
ob_get_clean — 取得目前作用中輸出緩衝區的內容並關閉它
此函式會呼叫輸出處理器(使用 PHP_OUTPUT_HANDLER_CLEAN
和 PHP_OUTPUT_HANDLER_FINAL
旗標),捨棄其返回值,返回作用中輸出緩衝區的內容,並關閉作用中輸出緩衝區。
如果沒有使用 PHP_OUTPUT_HANDLER_REMOVABLE
旗標啟動作用中輸出緩衝區,ob_get_clean() 將會失敗。
即使作用中輸出緩衝區是在沒有使用 PHP_OUTPUT_HANDLER_CLEANABLE
旗標的情況下啟動的,ob_get_clean() 也會捨棄其內容。
此函式沒有參數。
如果函式失敗,它會產生 E_NOTICE
錯誤。
範例 #1 一個簡單的 ob_get_clean() 範例
<?php
ob_start();
echo "Hello World";
$out = ob_get_clean();
$out = strtolower($out);
var_dump($out);
?>
上述範例將輸出:
string(11) "hello world"
另外,別忘了,對於任何後續的呼叫,您都需要再次 ob_start()。
<?php
ob_start();
echo "1";
$content = ob_get_clean();
ob_start(); // 這個 ob_start() 對於下一個 ob_get_clean() 能夠如預期般運作是必要的。
echo "2";
$content .= ob_get_clean();
echo $content;
?>
輸出:12
如果沒有第二個 ob_start(),輸出會是 21 ...
請記住,根據您執行 PHP 的方式(CGI、CLI 等),輸出可能會被預設緩衝。您可以使用 ob_get_level() 來判斷輸出緩衝區是否已經啟動。在我使用過的大多數網路伺服器上,在我的腳本開始執行之前,輸出緩衝區已經有一層了。
您應該只結束您啟動的輸出緩衝區數量。假設您的緩衝區始終是第一個緩衝區,或者關閉預先存在的緩衝區,可能會導致問題。在 PHP 5.5 中,您可以使用 try-finally 區塊確保輸出緩衝區正確結束。
像這樣的程式碼幾乎可以保證會出問題
<?php
// 千萬別這樣做!
while (ob_get_level() > 1)
{
ob_end_flush();
}
$content = ob_get_clean();
?>
問題在於數字「1」。在那裡使用固定數字會招惹麻煩。如果您真的必須使用未知數量的輸出緩衝區,請使用 ob_get_level() 取得程式碼啟動時套用的輸出緩衝區數量,並返回該數字。
<?php
ob_start();
$saved_ob_level = ob_get_level();
// 在這裡執行操作:
run_something();
// 如果您真的必須關閉除了一個以外的所有輸出緩衝區,這樣做就可以了:
while (ob_get_level() > $start_ob_level)
{
ob_end_flush();
}
// 現在,屬於我們的最終輸出緩衝區:
$content = ob_get_clean();
?>
<?php
ob_start();
echo "1";
$content = ob_get_clean();
echo "2";
$content .= ob_get_clean();
echo $content;
?>
這段程式碼在 CLI 模式下會輸出 21,在其他情況下(在我的 Apache 和 Nginx 環境中)會輸出 12。
我嘗試使用 error_log() 偵錯我的程式碼,發現 ob_get_clean() 不僅清空了它應該清空的輸出緩衝區,連 error_log() 的緩衝區也在輸出過程中被清空了。如果您正在使用 error_log(),請使用 ob_get_contents() 和 ob_end_clean() 來取代 ob_get_clean()。