預設 PHP 直接輸出到瀏覽器。啟用緩衝後,所有 echo/print、HTML 內容暫存於記憶體,可程式化控制何時、是否發送。
| 函數 | 用途 | 回傳值 |
|---|---|---|
ob_start() | 開啟緩衝 | bool |
ob_get_contents() | 取得緩衝內容(不清除) | string|false |
ob_get_clean() | 取得內容並關閉緩衝 | string|false |
ob_end_clean() | 丟棄內容並關閉緩衝 | bool |
ob_end_flush() | 發送內容並關閉緩衝 | bool |
ob_flush() | 發送內容(保留緩衝) | void |
ob_clean() | 清空內容(保留緩衝) | void |
<?php
ob_start();
include 'template/header.php';
$header = ob_get_clean(); // 取得並關閉
ob_start();
include 'template/body.php';
$body = ob_get_clean();
echo $header . $body;
?>
<?php
$imgPath = 'photo.jpg';
list($w, $h, $type) = getimagesize($imgPath);
$create = ['imagecreatefromgif','imagecreatefromjpeg','imagecreatefrompng'][$type-1] ?? null;
if (!$create) die('Unsupported format');
$src = $create($imgPath);
// 縮圖處理...
imagescale($src, 200);
ob_start();
switch ($type) {
case 1: imagegif($src); break;
case 2: imagejpeg($src, null, 90); break;
case 3: imagepng($src); break;
}
$imageBlob = ob_get_clean(); // 取得二進位字串
imagedestroy($src);
// $imageBlob 可直接存入 BLOB 欄位或 base64 編碼輸出
?>
<?php
ob_start(); // 腳本最開頭啟用
// 任意輸出、include、錯誤訊息...
// 稍後決定是否重導向
if ($needRedirect) {
header('Location: /login.php'); // 安全:緩衝區未發送
exit;
}
ob_end_flush(); // 正常結束發送
?>
<?php
ob_start();
echo "開始處理...<br>";
ob_flush(); flush(); // 強制送達瀏覽器
foreach (range(1, 100) as $i) {
// 耗時任務
usleep(50000);
if ($i % 10 === 0) {
echo "進度: $i%<br>";
ob_flush(); flush();
}
}
echo "完成!";
ob_end_flush();
?>
ob_start() 可多次呼叫,形成堆疊。ob_get_level() 取得當前層級。
<?php
ob_start(); // Level 1
echo "A";
ob_start(); // Level 2
echo "B";
$inner = ob_get_clean(); // "B", Level 1
echo "C";
$outer = ob_get_clean(); // "AC", Level 0
?>
ob_get_contents() 後未 ob_end_clean() 導致記憶體洩漏Content-Length 需在 ob_get_length() 後設定ob_gzhandler 自動壓縮需在 ob_start('ob_gzhandler') 指定