靜態 HTML 文件能大幅降低服務器負載,提升頁面加載速度,利於 SEO。PHP 生成靜態頁主要有模板替換、輸出緩存、URL 重寫緩存三大類方案。
最基礎的方式:讀取模板文件,替換標籤後寫入新文件。
<?php
$template = 'templets.html';
$output = 'page_' . date('YmdHis') . '.html';
$content = file_get_contents($template);
// 替換標籤,如 {title}、{content} 等
$content = str_replace(['{title}', '{content}'], ['文章標題', '文章正文內容...'], $content);
if (file_put_contents($output, $content) !== false) {
echo "靜態頁生成成功:$output";
} else {
echo "生成失敗,請檢查目錄寫入權限";
}
?>
避免文件名衝突,便於按時間管理。
<?php
$filename = date('YmdHis') . '.html';
$content = "<h1>動態生成的靜態頁</h1><p>生成時間:" . date('Y-m-d H:i:s') . "</p>";
$fp = fopen($filename, 'w');
if ($fp && fwrite($fp, $content)) {
fclose($fp);
echo "生成成功:$filename";
} else {
echo "生成失敗";
}
?>
利用 ob_start() 捕獲 PHP 腳本輸出,直接保存為靜態文件。
<?php
ob_start();
include 'dynamic_page.php'; // 包含邏輯複雜的動態頁
$html = ob_get_clean();
$staticFile = 'static_' . basename('dynamic_page.php', '.php') . '.html';
file_put_contents($staticFile, $html);
echo "靜態化完成:$staticFile";
?>
結合 .htaccess URL 重寫與 PHP 輸出緩存,實現「首次訪問生成,後續直接讀取靜態文件,過期自動更新」的智能緩存。
# .htaccess
RewriteEngine On
# 將 /post/xxx.html 重寫到 wp-post.php?slug=xxx
RewriteRule ^post/([a-z0-9-]+)\.html$ wp-post.php?slug=$1 [L,QSA]
<?php
// wp-post.php 頂部
ob_start();
$slug = $_GET['slug'] ?? '';
$cacheFile = $_SERVER['DOCUMENT_ROOT'] . "/post/{$slug}.html";
$cacheTime = 3600; // 緩存 1 小時
// 命中緩存且未過期,直接輸出
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $cacheTime)) {
readfile($cacheFile);
exit;
}
// --- 以下是原有動態業務邏輯 ---
// $data = getPostBySlug($slug);
// renderTemplate($data);
// --------------------------------
// 頁尾:寫入緩存
$html = ob_get_flush();
$meta = "<!-- cached at " . date('Y-m-d H:i:s') . " -->";
file_put_contents($cacheFile, $html . $meta);
?>
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 模板替換 | 簡單直觀,完全可控 | 維護成本高,邏輯混雜 | 簡單頁面、郵件模板 |
| 輸出緩存 | 無侵入式,復用現有動態頁 | 難以局部更新 | 整頁靜態化、CMS 文章頁 |
| URL 重寫+緩存 | 高性能,自動過期更新,對用戶透明 | 需配置 Web 服務器 | 高並發站點、內容型網站 |