利用 PHP `ob_start(callback)` 機制,在腳本結束前自動將**完整輸出內容**寫入靜態檔案,同時正常輸出給瀏覽器。無需修改業務邏輯,只需在頁面最頂端 `include` 一次、呼叫 `CreateShtml()` 即可。適合內容型站點 (文章、商品詳情、列表頁) 降低資料庫壓力、提升首屏速度。
<?php
/**
* 啟用靜態化:在頁面最開頭 require_once 'static.php'; CreateShtml();
* 產生檔案命名規則:腳本檔名.html (帶 ?page=N 參數則為 檔名_N.html)
*/
function CreateShtml() {
ob_start('callback_CreateShtml');
}
function callback_CreateShtml($buffer) {
// 1. 取得分頁參數 (預設 0 = 首頁)
$page = intval($_REQUEST['page'] ?? 0);
// 2. 組裝靜態檔路徑 (可自行修改儲存目錄)
$baseName = basename($_SERVER['PHP_SELF'], '.php');
$fileName = __DIR__ . '/static/' . $baseName . ($page === 0 ? '' : '_' . $page) . '.html';
// 3. 確保目錄存在
$dir = dirname($fileName);
if (!is_dir($dir)) mkdir($dir, 0755, true);
// 4. 寫入檔案 (二進位模式避免換行符轉換)
$fp = fopen($fileName, 'wb');
fwrite($fp, $buffer);
fclose($fp);
// 5. 返回原緩衝內容,繼續正常輸出給瀏覽器
return $buffer;
}
?>
<?php
require_once 'static.php';
CreateShtml(); // ★ 必須在任何輸出之前
?>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>靜態化測試</title></head>
<body>
<h1>歡迎來到 PHP 靜態化演示</h1>
<p>當前時間:<?php echo date('Y-m-d H:i:s'); ?></p>
<p>分頁參數 page = <?php echo intval($_GET['page'] ?? 0); ?></p>
</body>
</html>
| 需求 | 實作方案 |
|---|---|
| 多參數區分 (如 ?id=123&tab=detail) | `$key = md5($_SERVER['REQUEST_URI']);` 作為檔名雜湊,或解析 `$_GET` 組合語意化檔名 |
| 自動過期/更新 | 前端 Nginx `fastcgi_cache` + `purge`;或 PHP 端檢查 `filemtime() > $ttl` 重新生成 |
| CDN 同步刷新 | 生成成功後呼叫 CDN API 刷新對應 URL (阿里云/騰訊雲/Cloudflare 皆有 SDK) |
| 排除動態區塊 (用戶資訊、購物車、CSRF Token) | 頁面預留 `` 佔位符,callback 中 `preg_replace` 替換為 AJAX 載入標籤 |
| 部署多機同步 | 靜態檔寫入共享儲存 (NFS/GlusterFS/S3) 或生成後 `rsync` 到各節點 |
| 壓縮傳輸 | 生成 `.html.gz` 同步存放,Nginx `gzip_static on;` 直接服務預壓縮檔 |
這 20 行代碼,是理解「輸出緩衝 → 靜態落地」原理的最小模型。掌握它,你就擁有了為任何舊專案低成本加速的鑰匙。