首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 快取技術全景指南:資料、頁面、記憶體、時間觸發與靜態化策略

     編輯:PHP 綜合知識

為什麼需要快取?

典型資料庫查詢流程:連線 → 準備 SQL → 發送 → 等待 → 接收 → 關閉。高併發下,重複查詢靜態/低變動資料極其浪費資源。快取將查詢結果存入更快的存儲介質,大幅降低延遲與 DB 壓力。

五大主流快取策略對比

策略儲存介質適用場景優點缺點
資料快取檔案單機、低併發、查詢結果複用簡單、無額外依賴檔案 I/O 瓶頸、無原子性、難分散式
頁面快取檔案 (HTML)內容頁、列表頁、低頻更新頁面繞過 PHP 解析、極快動態內容難處理、清理策略複雜
記憶體快取Memcached / Redis / APCu高併發、分散式、Session、熱點資料微秒級讀寫、支援集群需額外服務、資料易失性(重啟丟失)
時間觸發檔案/記憶體容忍秒~分鐘級延遲的資料實作簡單、無需事件驅動資料不一致窗口不可控
內容觸發檔案/記憶體強一致性要求、寫入頻率可控資料即時一致寫入路徑耦合快取邏輯、寫放大風險
靜態化 (HTML)檔案/CDN極少變動頁面(首頁、產品詳情)純靜態、可直接走 Nginx/CDN動態區塊需 ESI/JS 回填、部署複雜

核心代碼範例

1. 檔案資料快取(基礎版)

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 = "

2. APCu 記憶體快取(單機高效能)

$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 分鐘
}

3. 頁面快取(Output Buffering)

$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;

4. 靜態化部署建議

  • 前端 Nginx 直接服務 .html,try_files $uri $uri/ /index.php 回退動態。
  • 後台發布/更新內容時,觸發重新產生對應 HTML(可用隊列異步處理)。
  • 動態區塊(用戶名、購物車數量)用 ESI (Nginx ngx_http_esi_module) 或 AJAX 回填。

進階避坑指南

  1. 快取穿透:查詢不存在的資料每次都穿透 DB。對策:快取空結果(短 TTL)、布隆過濾器攔截。
  2. 快取擊穿:熱點 Key 過期瞬間大量請求打穿 DB。對策:互斥鎖重建、熱點永不過期+異步更新。
  3. 快取雪崩:大量 Key 同時間過期。對策:TTL 加隨機抖動、多級快取(本地+分散式)。
  4. 資料一致性:寫入 DB 後異步刪除/更新快取(延遲雙刪:更新 DB → 刪快取 → sleep(100ms) → 再刪一次)。
  5. 序列化選擇:igbinary > msgpack > json > serialize(效能與體積綜合)。

總結選型建議

  • **中小專案、單機**:APCu + 檔案快取足矣。
  • **高併發、分散式**:Redis Cluster (資料結構豐富、持久化) 或 Memcached (純 K-V、多執行緒)。
  • **內容型網站**:全站靜態化 + CDN 為王道,動態介面走 API + 快取。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved