利用 ob_start() 開啟輸出緩衝,頁面結束時透過回呼函式將緩衝內容寫入靜態 HTML 檔案,同時正常輸出給瀏覽器。
<?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; // 仍輸出給瀏覽器
}
?>
<?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...ob_start() 包裹特定區塊(如側邊欄、推薦列表)ob_start() 造成巢狀衝突memory_limit 設定| 方案 | 優點 | 缺點 |
|---|---|---|
| Output Buffering (本文) | 程式碼改動最小、相容性好 | 首次請求仍執行 PHP、無法處理高度動態內容 |
| 模板引擎輸出靜態檔 | 關注點分離、效能佳 | 需重寫視圖層 |
| Nginx fastcgi_cache / proxy_cache | 完全透明、效能最高 | 清除快取較複雜、動態內容處理需小心 |
| Varnish / CDN | 架構層級解耦、支援 ESI | 運維成本高 |