首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 輸出緩衝控制全解析:ob_start、ob_get_contents、ob_end_clean 實戰應用

     編輯:PHP 相關知識

輸出緩衝機制

預設 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

經典應用場景

1. 捕獲輸出到變數(模板引擎核心)

<?php
ob_start();
include 'template/header.php';
$header = ob_get_clean(); // 取得並關閉

ob_start();
include 'template/body.php';
$body = ob_get_clean();

echo $header . $body;
?>

2. 圖片二進位內容捕獲(存入資料庫/變數)

<?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 編碼輸出
?>

3. 避免「Headers already sent」錯誤

<?php
ob_start(); // 腳本最開頭啟用
// 任意輸出、include、錯誤訊息...
// 稍後決定是否重導向
if ($needRedirect) {
    header('Location: /login.php'); // 安全:緩衝區未發送
    exit;
}
ob_end_flush(); // 正常結束發送
?>

4. 分階段輸出大量資料(配合 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') 指定
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved