將動態生成的 HTML 內容寫入靜態文件,後續請求直接讀取文件,繞過 PHP 腳本執行與數據庫查詢,極大降低延遲。
<?php
$cacheFile = 'static.html';
$cacheTime = 180; // 緩存 3 分鐘(秒)
// 1. 緩存存在且未過期 → 直接輸出
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $cacheTime)) {
echo "我是從靜態文件中讀取的數據:
";
echo file_get_contents($cacheFile);
exit;
}
// 2. 否則執行業務邏輯,捕獲輸出
ob_start();
// ---- 業務邏輯開始 ----
// 模擬數據庫查詢
$users = [
['id'=>1, 'name'=>'Alice'],
['id'=>2, 'name'=>'Bob'],
['id'=>3, 'name'=>'Charlie'],
];
echo "用戶列表
";
foreach ($users as $u) {
echo "- {$u['name']}
";
}
echo "
";
// ---- 業務邏輯結束 ----
$html = ob_get_contents();
ob_end_clean();
// 3. 寫入緩存文件
file_put_contents($cacheFile, $html);
// 4. 輸出給用戶
echo $html;
?>
| 場景 | 平均執行時間 |
|---|---|
| 查詢數據庫(3 條記錄,單表) | 0.000804 秒 |
| 讀取靜態緩存文件 | 0.000047 秒 |
隨著數據量增長、涉及多表 JOIN,數據庫查詢耗時將呈指數級上升,而靜態文件讀取時間幾乎不變。
| ✅ 適合靜態化 | ❌ 不適合靜態化 |
|---|---|
| 內容更新頻率低(文章、產品頁、幫助文檔) | 實時數據(股票行情、即時聊天、用戶個性化推薦) |
| 訪問量大、併發高的公共頁面 | 涉及用戶權限、登入狀態強相關的頁面 |
| SEO 落地頁、列表頁 | 頻繁變動的儀表盤、後台管理頁 |
try_files /cache/$uri.html $uri $uri/ /index.php; 讓 Nginx 繞過 PHP-FPM 直接返回 .html,性能更強。file_put_contents($file, gzencode($html, 9)) 節省磁碟空間,讀取時 gzinflate() 解壓。chmod 755 + 正確用戶組)。