在 PHP 應用效能優化的道路上,緩存技術佔據著核心地位。本文將深入探討 PEAR Cache 套件中兩種極具實戰價值的緩存模式——內容緩存與函數緩存,幫助開發者顯著降低伺服器負載、縮短響應時間。
內容緩存的核心邏輯是「用空間換時間」:首次請求時執行 PHP 程式生成內容並存入檔案(或資料庫、記憶體),後續請求直接讀取緩存檔輸出,跳過繁重的業務邏輯運算與資料庫查詢。
首先看一個無緩存的簡單腳本:
<?php
echo "這是內容。<p>";
echo "當前時間是 " . date('M-d-Y H:i:s A', time()) . "<br>";
?>
每次重整頁面,時間都會更新。現在引入 PEAR::Cache_Output 實現輸出緩存:
<?php
require_once 'Cache/Output.php';
// 設定緩存目錄(需可寫入權限)
$cacheDir = './pear_cache';
$cache = new Cache_Output('file', array('cache_dir' => $cacheDir));
// 判斷是否強制刷新(帶 nocache 參數時跳過緩存)
if (empty($_REQUEST['nocache'])) {
// 依據 URL、POST、Cookie 生成唯一緩存 ID
$cache_id = $cache->generateID(array(
'url' => $_REQUEST,
'post' => $_POST,
'cookies' => $HTTP_COOKIE_VARS
));
} else {
$cache_id = null; // 強制更新
}
// 嘗試啟動緩存:若命中則直接輸出並結束腳本
if ($content = $cache->start($cache_id)) {
echo $content;
exit();
}
// 緩存未命中:執行業務邏輯生成內容
echo "這是內容。<p>";
echo "當前時間是 " . date('M-d-Y H:i:s A', time()) . "<br>";
// 結束緩存並寫入檔案
echo $cache->end();
?>
require_once 'Cache/Output.php';generateID() 根據請求參數確保不同用戶、不同頁面緩存隔離。$cache->start($cache_id) 若返回內容表示命中,直接輸出並 exit()。$cache->end() 將輸出緩衝區內容寫入緩存檔。範例中透過 ?nocache=1 參數讓使用者或管理員繞過緩存獲取最新資料,這在 CMS 後台發布文章後預覽、電商價格更新等場景極為實用。
若某個函數運算複雜(如複雜統計、外部 API 呼叫、大量資料處理)且相同參數下結果固定,可使用 Cache_Function 將其返回值緩存,避免重複執行。
<?php
require_once 'Cache/Function.php';
$cacheDir = './pear_cache/';
$cache = new Cache_Function('file', array('cache_dir' => $cacheDir));
$arr = array('蘋果', '梨', '西瓜');
// 第一次調用:執行函數並緩存結果
$cache->call('slowFunction', $arr);
echo '<br>';
// 第二次調用:直接讀取緩存(若未過期)
$arr = array('蘋果', '梨', '西瓜');
slowFunction($arr);
function slowFunction($arr = null) {
echo "一個執行起來很慢的函數 :( <br>";
echo "當前時間是 " . date('M-d-Y H:i:s A', time()) . '<br>';
foreach ($arr as $fruit) {
echo "我吃了一個 $fruit <br>";
}
}
?>
首次載入顯示 17:15:57,第二次直接調用函數顯示 17:17:55(時間變化證明函數確實執行了),但透過 $cache->call() 的調用時間戳保持不變,證明緩存生效。
slowFunction($arr) 改為 $cache->call('slowFunction', $arr)。| 緩存類型 | 適用場景 | 注意事項 |
|---|---|---|
內容緩存 (Cache_Output) |
整頁或區塊輸出相對靜態的頁面(文章詳情、商品列表、首頁) | |
函數緩存 (Cache_Function) |
純函數、冪等運算、外部服務呼叫封裝 |
PEAR Cache 雖屬經典套件,但其設計理念(策略模式分離儲存引擎、ID 生成機制、緩存生命週期管理)至今仍具參考價值。現代專案中可考慮搭配 Redis、Memcached 等高效能儲存後端,或升級至 Symfony Cache、Laravel Cache 等現代元件,核心邏輯不變,效能更強。