現代高併發 PHP 應用通常構建多層緩存體系:
用戶請求 ↓ 瀏覽器緩存 (Cache-Control, ETag) ↓ CDN 邊緣節點緩存 ↓ Nginx/Apache 靜態文件緩存 / 反向代理緩存 (proxy_cache) ↓ PHP 全頁面靜態化 (HTML 文件) ↓ PHP 頁面片段緩存 (ESI / 局部緩存) ↓ 業務數據緩存 (Redis / Memcached / APCu) ↓ 數據庫查詢緩存 / 表結構緩存 ↓ 數據庫存儲引擎緩存 (InnoDB Buffer Pool)
將動態頁面生成為純 HTML 文件,用戶直接訪問靜態文件,完全繞過 PHP 解析。
<?php
ob_start();
// 業務邏輯、模板渲染
$content = ob_get_contents();
file_put_contents('cache/page_'.$id.'.html', $content);
ob_end_clean();
?>
頁面中「不常變」的區塊 (導航、側邊欄、推薦模塊) 獨立緩存,動態區塊 (用戶信息、購物車) 實時渲染。
ob_get_contents() 存儲片段 HTML,或使用 ESI (Edge Side Includes) 讓 Nginx/Varnish 組裝。將數據庫查詢結果 (陣列/對象) 序列化存入文件或內存,鍵名通常包含業務 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, '
以 SQL 語句 (或其哈希) 為鍵緩存結果集。注意:相同查詢不同參數需區分鍵名。
所有文件/內存緩存必須設定 TTL (Time To Live)。
後台編輯保存時,同步更新/刪除對應緩存文件或鍵。
<?php
// 後台更新商品後
$cacheKey = "product_{$id}";
$memcached->delete($cacheKey);
// 或重新生成靜態頁
generateStaticPage($id);
?>
高性能分布式 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');
?>
| 特性 | Memcached | Redis |
|---|---|---|
| 數據結構 | 單純 Key-String | String, Hash, List, Set, SortedSet... |
| 持久化 | 不支持 (重啟丟失) | RDB/AOF 可選 |
| 集群方案 | 客戶端一致性哈希 | 原生 Cluster / Sentinel |
| 適用場景 | 純緩存、Session 共享 | 緩存+隊列+排行榜+發布訂閲+輕量持久化 |
./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
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;
}
}

編譯產生的 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