PHP Conference Japan 2024

ob_get_clean

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

ob_get_clean取得目前作用中輸出緩衝區的內容並關閉它

說明

ob_get_clean(): 字串|false

此函式會呼叫輸出處理器(使用 PHP_OUTPUT_HANDLER_CLEANPHP_OUTPUT_HANDLER_FINAL 旗標),捨棄其返回值,返回作用中輸出緩衝區的內容,並關閉作用中輸出緩衝區。

如果沒有使用 PHP_OUTPUT_HANDLER_REMOVABLE 旗標啟動作用中輸出緩衝區,ob_get_clean() 將會失敗。

即使作用中輸出緩衝區是在沒有使用 PHP_OUTPUT_HANDLER_CLEANABLE 旗標的情況下啟動的,ob_get_clean() 也會捨棄其內容。

參數

此函式沒有參數。

返回值

成功時返回作用中輸出緩衝區的內容,失敗時返回 false

注意事項

如果沒有作用中輸出緩衝區,ob_get_clean() 將返回 false,但不會產生 E_NOTICE 錯誤。

錯誤/例外

如果函式失敗,它會產生 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() - 開啟輸出緩衝
  • ob_get_contents() - 返回輸出緩衝區的內容
  • ob_clean() - 清除(擦除)作用中輸出緩衝區的內容
  • ob_end_clean() - 清除(擦除)作用中輸出緩衝區的內容並關閉它
  • ob_get_flush() - 刷新(發送)作用中輸出處理器的返回值,返回作用中輸出緩衝區的內容並關閉它

新增註釋

使用者貢獻的註釋 5 則註釋

geo dot artemenko at gmail dot com
10 年前
定義中應該提到,該函式也會「關閉輸出緩衝」,而不僅僅是清除它。
steven at bielik dot com
13 年前
另外,別忘了,對於任何後續的呼叫,您都需要再次 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 ...
paul+phpnet at earth2me dot com
11 年前
請記住,根據您執行 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();
?>
sergei dot solomonov at gmail dot com
12 年前
<?php
ob_start
();
echo
"1";
$content = ob_get_clean();

echo
"2";
$content .= ob_get_clean();

echo
$content;
?>

這段程式碼在 CLI 模式下會輸出 21,在其他情況下(在我的 Apache 和 Nginx 環境中)會輸出 12。
Peter Smartt
7 年前
我嘗試使用 error_log() 偵錯我的程式碼,發現 ob_get_clean() 不僅清空了它應該清空的輸出緩衝區,連 error_log() 的緩衝區也在輸出過程中被清空了。如果您正在使用 error_log(),請使用 ob_get_contents() 和 ob_end_clean() 來取代 ob_get_clean()。
To Top