當用戶訪問動態頁面時,伺服器需執行 PHP 腳本、查詢數據庫、組裝數據,最後輸出 HTML。若網站流量達百萬甚至千萬級,頻繁的數據庫查詢與腳本解析將造成伺服器極大負擔。將動態內容預先生成靜態 HTML 檔案,用戶請求時直接讀取靜態檔案,可大幅降低伺服器壓力,提升響應速度,是高流量網站優化的首選策略。
主流模板引擎(如 Smarty、SmartTemplate)均提供「獲取輸出內容」的方法。利用此特性,我們可將模板渲染結果捕獲並寫入檔案,而非直接輸出給瀏覽器。此法代碼結構清晰、可讀性強,便於維護。
fetch() 獲取渲染後的 HTML 字串fopen()、fwrite() 將字串寫入靜態檔案<?php
require("smarty/Smarty.class.php");
$t = new Smarty;
$t->assign("title", "Hello World!");
$content = $t->fetch("templates/index.htm"); // 獲取輸出內容
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);
fclose($fp);
?>
PHP 的 ob_start() 可開啟輸出緩衝區,使後續輸出(echo、HTML 等)暫存於記憶體而非直接發送。配合 ob_get_contents() 讀取緩衝內容,ob_end_flush() 關閉緩衝並輸出,即可實現靜態化。此法無需依賴模板引擎,靈活度極高。
<?php
ob_start();
echo "Hello World!";
$content = ob_get_contents(); // 取得全部輸出內容
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);
fclose($fp);
?>
實際專案常需批量生成(如數百篇文章)。關鍵在於動態構建檔案路徑,避免硬編碼。以下範例結合 XML 數據解析,演示如何根據 ID 動態生成檔案名:
<?php
ob_start(); // 開啟緩衝
// --- 解析 XML 數據(略)---
$parser = xml_parser_create();
xml_set_element_handler($parser, "startElement", "endElement");
xml_set_character_data_handler($parser, "characterData");
$xml_file = "1.xml";
$fp = fopen($xml_file, "r");
while ($data = fread($fp, 4096)) {
xml_parse($parser, $data, feof($fp));
}
fclose($fp);
xml_parser_free($parser);
// --- XML 解析結束 ---
// 動態構建檔案路徑
$id = 123; // 假設來自用戶傳參
$htmlname = $id . ".html";
$htmlpath = "archives/" . $htmlname;
$content = ob_get_contents(); // 獲取緩衝內容
$fp = fopen($htmlpath, "w");
fwrite($fp, $content);
fclose($fp);
?>
| 模式 | 說明 |
|---|---|
| r | 唯讀,指針指向檔頭 |
| r+ | 讀寫,指針指向檔頭 |
| w | 寫入,指針指向檔頭並截斷檔案;不存在則創建 |
| w+ | 讀寫,指針指向檔頭並截斷檔案;不存在則創建 |
fwrite() 寫入內容,fclose() 關閉檔案釋放資源,務必成對使用。
模板引擎法適合結構固定、維護性要求高的場景;輸出緩衝法更輕量、靈活,適合快速開發或特殊需求。根據專案規模與團隊技術棧選擇即可。