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

PHP 靜態頁面生成:Output Buffering 實作

     編輯:PHP 相關知識

核心原理

利用 ob_start() 開啟輸出緩衝,頁面結束時透過回呼函式將緩衝內容寫入靜態 HTML 檔案,同時正常輸出給瀏覽器。

靜態化類別 (static.php)

<?php
function CreateShtml() {
    ob_start("callback_CreateShtml");
}

function callback_CreateShtml($buffer) {
    $page = intval(@$_REQUEST['page']);
    // 檔名規則:basename.php → basename.html 或 basename_2.html
    $base = basename($_SERVER['PHP_SELF'], ".php");
    $fileName = $base . ($page == 0 ? "" : "_" . $page) . ".html";
    // 可自訂路徑:$_SERVER['DOCUMENT_ROOT'] . "/cache/" . $fileName

    $fp = fopen($fileName, "wb");
    fwrite($fp, $buffer);
    fclose($fp);
    return $buffer; // 仍輸出給瀏覽器
}
?>

使用範例 (phpfans.php)

<?php
include("static.php");
CreateShtml();
?>
<html>
<head><title>靜態頁面測試</title></head>
<body>
<?php echo "PHP 愛好者站歡迎你, https://www.phpfans.net"; ?>
</body>
</html>

進階應用場景

  • 分頁靜態化:配合 page 參數生成 list_1.html, list_2.html...
  • 定時更新:Crontab 定時請求動態頁觸發重新生成
  • 條件靜態化:僅對匿名使用者輸出靜態頁,登入用戶顯示動態內容
  • 局部靜態化:ob_start() 包裹特定區塊(如側邊欄、推薦列表)

注意事項

  1. 確保目錄可寫入(權限 755/777)
  2. 避免在緩衝回呼中再次呼叫 ob_start() 造成巢狀衝突
  3. 大量資料頁面注意 memory_limit 設定
  4. 靜態檔案需配合 Web Server 快取策略(Expires Header、ETag)
  5. 更新機制:資料異動時刪除對應靜態檔或觸發重新生成

替代方案比較

方案優點缺點
Output Buffering (本文)程式碼改動最小、相容性好首次請求仍執行 PHP、無法處理高度動態內容
模板引擎輸出靜態檔關注點分離、效能佳需重寫視圖層
Nginx fastcgi_cache / proxy_cache完全透明、效能最高清除快取較複雜、動態內容處理需小心
Varnish / CDN架構層級解耦、支援 ESI運維成本高
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved