將動態頁面靜態化可大幅降低伺服器負載、提升前端效能。本文總結三種主流生成靜態 HTML 的方法,從基礎輸出緩衝到 Smarty 模板整合,附完整程式碼與優缺點分析。
<?php
ob_start(); // 開啟輸出緩衝
// ... 頁面邏輯與輸出 ...
$temp = ob_get_contents(); // 取得緩衝內容
ob_end_clean(); // 關閉並清空緩衝
$fp = fopen('page.html', 'w');
fwrite($fp, $temp) or die('寫入失敗');
fclose($fp);
?>
<?php
$cacheFile = 'page.html';
$cacheTime = 30 * 60; // 30 分鐘
// 快取存在且未過期 → 直接導向靜態頁
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $cacheTime)) {
header("Location: $cacheFile");
exit;
}
ob_start();
// ... 頁面邏輯與輸出 ...
$temp = ob_get_contents();
ob_end_clean();
$fp = fopen($cacheFile, 'w');
fwrite($fp, $temp) or die('寫入失敗');
fclose($fp);
header("Location: $cacheFile");
?>
<?php
// 取得表單資料
$title = $_POST['htmltitle'];
$body = $_POST['htmlbody'];
// 組裝 HTML
$html = "<html><head><title>$title</title></head><body>$body</body></html>";
// 以日期建立目錄
$dir = date('Y-m-d');
if (!is_dir($dir)) mkdir($dir, 0777);
// 以時間戳命名檔案
$file = $dir . '/' . date('YmdHis') . '.html';
$fp = fopen($file, 'w');
fwrite($fp, $html);
fclose($fp);
echo "<script>alert('生成成功'); location.href='list.php';</script>";
?>
<?php
require_once 'Smarty.class.php';
$smarty = new Smarty();
$id = $_GET['id'];
$row = $db->getRow("SELECT * FROM news WHERE id=$id");
$smarty->assign('title', $row['title']);
$smarty->assign('content', $row['content']);
// 取得渲染後內容(不直接輸出)
$content = $smarty->fetch('news_detail.tpl');
// 寫入靜態檔
$file = "news/$id.html";
$fp = fopen($file, 'w');
fwrite($fp, $content);
fclose($fp);
?>
<?php
$content = $smarty->fetch('template.tpl', $cache_id, $compile_id, false);
// 參數:模板名、快取ID、編譯ID、是否直接顯示
// false 表示回傳字串而非輸出
?>
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 基礎 ob_start | 簡單、無相依 | 無快取機制、每次重生成 | 極簡頁面、臨時需求 |
| 快取過期機制 | 效能好、自動更新 | 需管理快取檔案權限 | 內容型網站、文章頁 |
| 表單生成 | 後台編輯即時生成 | 需人工觸發 | CMS 後台發文流程 |
| Smarty 整合 | 模板分離、易維護 | 需學習模板語法 | 中大型專案、團隊開發 |
chmod 777 或指定使用者群組)