典型資料庫查詢流程:連線 → 準備 SQL → 發送 → 等待 → 接收 → 關閉。高併發下,重複查詢靜態/低變動資料極其浪費資源。快取將查詢結果存入更快的存儲介質,大幅降低延遲與 DB 壓力。
| 策略 | 儲存介質 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|---|
| 資料快取 | 檔案 | 單機、低併發、查詢結果複用 | 簡單、無額外依賴 | 檔案 I/O 瓶頸、無原子性、難分散式 |
| 頁面快取 | 檔案 (HTML) | 內容頁、列表頁、低頻更新頁面 | 繞過 PHP 解析、極快 | 動態內容難處理、清理策略複雜 |
| 記憶體快取 | Memcached / Redis / APCu | 高併發、分散式、Session、熱點資料 | 微秒級讀寫、支援集群 | 需額外服務、資料易失性(重啟丟失) |
| 時間觸發 | 檔案/記憶體 | 容忍秒~分鐘級延遲的資料 | 實作簡單、無需事件驅動 | 資料不一致窗口不可控 |
| 內容觸發 | 檔案/記憶體 | 強一致性要求、寫入頻率可控 | 資料即時一致 | 寫入路徑耦合快取邏輯、寫放大風險 |
| 靜態化 (HTML) | 檔案/CDN | 極少變動頁面(首頁、產品詳情) | 純靜態、可直接走 Nginx/CDN | 動態區塊需 ESI/JS 回填、部署複雜 |
function getCache($key, $ttl = 3600) {
$file = sys_get_temp_dir() . "/cache_{$key}.php";
if (file_exists($file) && (time() - filemtime($file) < $ttl)) {
return include $file; // 直接 require 返回陣列
}
return false;
}
function setCache($key, $data) {
$file = sys_get_temp_dir() . "/cache_{$key}.php";
$content = "
$key = 'hot_article_list';
$data = apcu_fetch($key);
if ($data === false) {
$data = $db->query("SELECT * FROM articles WHERE hot=1 LIMIT 20")->fetchAll();
apcu_store($key, $data, 300); // 5 分鐘
}
$cacheFile = 'cache/' . md5($_SERVER['REQUEST_URI']) . '.html';
$ttl = 7200; // 2 小時
if (file_exists($cacheFile) && (time() - filemtime($cacheFile) < $ttl)) {
readfile($cacheFile);
exit;
}
ob_start();
// ... 正常業務邏輯輸出 HTML ...
$html = ob_get_clean();
file_put_contents($cacheFile, $html, LOCK_EX);
echo $html;
.html,try_files $uri $uri/ /index.php 回退動態。ESI (Nginx ngx_http_esi_module) 或 AJAX 回填。igbinary > msgpack > json > serialize(效能與體積綜合)。