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

PHP 緩存技術全景指南:從頁面靜態化到分布式內存緩存

     編輯:PHP 相關知識

緩存分層架構

現代高併發 PHP 應用通常構建多層緩存體系:

用戶請求
   ↓
瀏覽器緩存 (Cache-Control, ETag)
   ↓
CDN 邊緣節點緩存
   ↓
Nginx/Apache 靜態文件緩存 / 反向代理緩存 (proxy_cache)
   ↓
PHP 全頁面靜態化 (HTML 文件)
   ↓
PHP 頁面片段緩存 (ESI / 局部緩存)
   ↓
業務數據緩存 (Redis / Memcached / APCu)
   ↓
數據庫查詢緩存 / 表結構緩存
   ↓
數據庫存儲引擎緩存 (InnoDB Buffer Pool)

七大 PHP 緩存策略詳解

1. 全頁面靜態化緩存

將動態頁面生成為純 HTML 文件,用戶直接訪問靜態文件,完全繞過 PHP 解析。

<?php
ob_start();
// 業務邏輯、模板渲染
$content = ob_get_contents();
file_put_contents('cache/page_'.$id.'.html', $content);
ob_end_clean();
?>
  • 適用:內容更新頻率低、SEO 需求高的頁面 (文章詳情、商品頁、列表頁)
  • 更新策略:後台發布/編輯時重新生成、定時任務批量更新、CDN 刷新 API
  • 代表系統:DedeCMS、WordPress 靜態化插件

2. 頁面片段緩存

頁面中「不常變」的區塊 (導航、側邊欄、推薦模塊) 獨立緩存,動態區塊 (用戶信息、購物車) 實時渲染。

  • 實現:ob_get_contents() 存儲片段 HTML,或使用 ESI (Edge Side Includes) 讓 Nginx/Varnish 組裝。
  • 適用:電商商品頁 (基本信息靜態、價格/庫存/用戶態動態)

3. 數據緩存

將數據庫查詢結果 (陣列/對象) 序列化存入文件或內存,鍵名通常包含業務 ID。

<?php
$cacheFile = "cache/product_{$id}.php";
if (file_exists($cacheFile) && time() - filemtime($cacheFile) < 3600) {
    $data = include $cacheFile; // 直接返回陣列
} else {
    $data = $db->query("SELECT * FROM product WHERE id=$id");
    file_put_contents($cacheFile, '
  • 代表:ECShop、ECMall 等電商系統廣泛使用文件緩存

4. 查詢緩存

以 SQL 語句 (或其哈希) 為鍵緩存結果集。注意:相同查詢不同參數需區分鍵名。

5. 基於時間的過期策略

所有文件/內存緩存必須設定 TTL (Time To Live)。

  • 首頁:2 小時更新一次
  • 分類頁:30 分鐘
  • 用戶個人中心:不緩存或極短 TTL

6. 基於內容變更的主動失效

後台編輯保存時,同步更新/刪除對應緩存文件或鍵。

<?php
// 後台更新商品後
$cacheKey = "product_{$id}";
$memcached->delete($cacheKey);
// 或重新生成靜態頁
generateStaticPage($id);
?>
  • 優勢:數據強一致性,無「髒讀」時間窗口
  • 適用:高併發、數據準確性要求高的場景 (庫存、價格、訂單狀態)

7. 內存式緩存:Memcached / Redis

高性能分布式 Key-Value 存儲,微秒級讀寫,支援集群擴展。

<?php
$mem = new Memcached();
$mem->addServer('192.168.1.10', 11211);
$mem->set('user_1001', ['name'=>'Tom','vip'=>true], 3600);
$data = $mem->get('user_1001');
?>
特性MemcachedRedis
數據結構單純 Key-StringString, Hash, List, Set, SortedSet...
持久化不支持 (重啟丟失)RDB/AOF 可選
集群方案客戶端一致性哈希原生 Cluster / Sentinel
適用場景純緩存、Session 共享緩存+隊列+排行榜+發布訂閲+輕量持久化

Web Server 級緩存模組

Apache mod_cache / mod_disk_cache / mod_mem_cache

./configure --enable-cache --enable-disk-cache --enable-mem-cache
LoadModule cache_module modules/mod_cache.so
LoadModule disk_cache_module modules/mod_disk_cache.so
CacheEnable disk /
CacheRoot /var/cache/apache2
CacheMaxFileSize 1000000

Nginx proxy_cache / fastcgi_cache

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m inactive=60m;
server {
    location / {
        proxy_cache my_cache;
        proxy_cache_valid 200 302 10m;
        proxy_cache_key $scheme$host$request_uri;
        add_header X-Cache $upstream_cache_status;
    }
}

PHP APC / OPcache 字節碼緩存

PHP 執行流程與 Opcode 緩存

編譯產生的 Opcode 存入共享內存,下次請求直接執行。PHP 5.5+ 內建 Zend OPcache,配置示例:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.validate_timestamps=0
opcache.revalidate_freq=60

選型建議決策樹

  1. **靜態內容多、更新少** → 全頁面靜態化 + CDN
  2. **頁面動靜結合** → 片段緩存 (ESI) + 數據緩存
  3. **高併發讀、寫較少** → Redis/Memcached 數據緩存 + 主動失效
  4. **Session 共享、臨時數據** → Redis (支援持久化) 或 Memcached
  5. **微服務架構** → 統一接入網關層緩存 (Kong/Traefik + Redis)

避坑指南

  • 緩存穿透:查詢不存在的數據每次直穿 DB → 布隆過濾器或緩存空對象
  • 緩存雪崩:大量鍵同期過期 → TTL 加隨機值、多級緩存兜底
  • 緩存擊穿:熱點鍵失效瞬間大量請求打 DB → 互斥鎖重建 (Redis SETNX)
  • 數據不一致:雙寫失敗、主從延遲 → 延時雙刪、讀寫分離路由、最終一致性補償
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved