在 Web 開發中,理解動態與靜態頁面的處理流程至關重要。PHP 腳本作為伺服器端語言,其執行流程為:客戶端請求 → Web 伺服器調用 PHP 解析器 → 解析腳本生成 HTML → 回傳瀏覽器。此過程中,PHP 代碼在伺服器端執行完畢後即不復存在,瀏覽器僅接收純 HTML。這就是所謂的「動態頁面」——每次請求即時生成內容,通常涉及資料庫查詢,靈活但消耗伺服器資源。
相對地,靜態頁面為預先存在於伺服器的純 HTML/CSS/JS 文件。請求時無需解析、無需查詢資料庫,直接傳輸文件,極大降低伺服器負載,顯著提升頁面載入速度。缺點在於內容固定,無法即時響應用戶互動或數據變化。
模板技術將頁面結構(HTML 骨架)與動態數據分離。典型流程:讀取模板文件 → 以標記(如 {title}、{content})為鍵 → 用 PHP 變量替換標記 → 輸出完整 HTML。主流模板引擎(Smarty、FastTemplate 等)進一步封裝了條件判斷、迴圈輸出等邏輯,支援 block 概念實現複雜列表渲染。
PHP 生成靜態文件的核心在於 fopen()、fwrite()、fclose() 等文件系統函數。關鍵條件:目標目錄需具備寫入權限(Linux 下為 0777,Windows 無需額外配置)。基本範例:
<?php
$title = "示例標題";
$content = "這是模板內容:{title}";
$template = file_get_contents("template.html");
$html = str_replace("{title}", $title, $template);
$file = "static/page.html";
$fp = fopen($file, "w");
if (is_writable($file) && fwrite($fp, $html)) {
fclose($fp);
echo "靜態文件生成成功:$file";
} else {
die("生成失敗,請檢查目錄權限");
}
?>
將動態查詢的列表數據組裝為 HTML 字符串,以標記(如 {article_list})植入模板:
$list = "";
$sql = "SELECT id, title, filename FROM articles";
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) {
$list .= "<a href='{$row['filename']}'>{$row['title']}</a><br>";
}
$html = str_replace("{article_list}", $list, $template);
對於大量數據,需按分頁生成多個靜態文件(如 index.html、index_2.html...)。核心邏輯:
ceil(總記錄數 / 每頁條數)unlink() 刪除重建die() 中斷流程$perPage = 20;
$total = mysqli_num_rows(mysqli_query($conn, "SELECT id FROM articles"));
$pages = ceil($total / $perPage);
for ($i = 0; $i < $pages; $i++) {
$offset = $i * $perPage;
$file = ($i === 0) ? "index.html" : "index_{$i}.html";
// 獲取當前頁數據、替換模板、寫入文件...
if (file_exists($file)) unlink($file);
file_put_contents($file, $pageHtml);
}
echo "分頁靜態文件生成完成";
flock())或消息佇列異步生成,防止文件損壞。靜態化並非銀彈,適用於內容更新頻率較低、訪問量大的場景(如文章詳情、商品頁、分類列表)。結合 CDN 緩存、反向代理(Nginx)可進一步極致性能。現代框架(Laravel、ThinkPHP)均提供靜態緩存組件,實戰中建議優先使用成熟方案,專注業務創新。