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

PHP 快取技術全景解析:從頁面快取到資料快取的效能優化實戰

     編輯:PHP 相關知識

快取本質:以空間換時間的藝術

快取核心邏輯:將昂貴運算結果(資料庫查詢、複雜運算、模板渲染)儲存於高速介質,後續請求直接讀取,繞過重複計算。 快取層級由快到慢:CPU 快取 → 記憶體 → 本地磁碟 → 網路儲存 → 資料庫。

PHP 兩大快取模式對比

1. 頁面快取:輸出端攔截

捕獲最終 HTML 輸出,下次請求直接送出,繞過 PHP 執行與模板渲染。

// 輸出緩衝區快取(內建)
ob_start();
// ... 複雜業務邏輯與模板渲染 ...
$html = ob_get_clean();
file_put_contents('cache/page.html', $html);

// 後續請求
if (file_exists('cache/page.html') && time() - filemtime('cache/page.html') < 300) {
    readfile('cache/page.html');
    exit;
}

適用場景:內容較靜態、個性化程度低的頁面(首頁、列表頁、文章頁)。
優點:效能極致、實作簡單。
缺點:難以處理動態區塊(用戶資訊、購物車)、快取失效策略複雜。

2. 資料快取:業務邏輯層介入

快取結構化資料(陣列、物件),由程式碼控制讀寫時機。

// ADOdb 資料快取範例
include('adodb/adodb.inc.php');
$ADODB_CACHE_DIR = 'tmp';
$db = NewADOConnection('mysql');
$db->Connect('localhost', 'root', 'pass', 'db');
$sql = "SELECT * FROM products WHERE category = ?";
$rs = $db->CacheExecute(300, $sql, [$catId]); // 300 秒快取

// Smarty 模板快取
require('Smarty.class.php');
$smarty = new Smarty;
$smarty->caching = true;
$smarty->cache_lifetime = 300;

if (!$smarty->is_cached('index.tpl')) {
    $data = getProductsFromDB(); // 昂貴操作
    $smarty->assign('products', $data);
}
$smarty->display('index.tpl');

適用場景:高度動態、需精細控制快取粒度的業務邏輯。
優點:靈活控制快取內容與生命週期、支援局部更新。
缺點:程式碼侵入性強、需設計快取鍵策略。

快取儲存介質選型指南

介質速度容量持久性適用場景
記憶體極快小掉電失效Session、熱點資料、計數器
Redis極快中可持久化分散式快取、Session 共享、排行榜
Memcached極快中無持久化簡單 Key-Value、多伺服器叢集
本地檔案中大持久頁面快取、小型專案、開發環境
資料庫慢大持久結構化查詢、需事務支援場景

進階快取策略模式

1. Cache-Aside(旁路快取)

應用程式負責讀寫快取與資料庫,最常見模式:

function getUser($id) {
    $key = "user:$id";
    if ($data = $redis->get($key)) return json_decode($data, true);
    
    $data = $db->query("SELECT * FROM users WHERE id = ?", [$id]);
    $redis->setex($key, 3600, json_encode($data));
    return $data;
}

2. Write-Through / Write-Behind

  • Write-Through:同步寫入快取與資料庫,資料強一致但延遲較高
  • Write-Behind:寫入快取後非同步批次持久化,高效能但有資料遺失風險

3. 快取失效策略

  • TTL 過期:簡單但可能誤刪熱點資料
  • 主動失效:資料更新時同步刪除/更新快取
  • 版本號/標籤:關聯式失效,如 user:123、tag:user:123

實戰避坑指南

  1. 快取穿透:查詢不存在資料導致直穿資料庫 → 快取空值(短 TTL)或布隆過濾器
  2. 快取雪崩:大量快取同期失效 → TTL 加入隨機抖動、多級快取
  3. 快取擊穿:熱點 Key 失效瞬間高併發 → 互斥鎖重建、永不過期+異步更新
  4. 資料一致性:雙寫失敗、主從延遲 → 延遲雙刪、讀取時校驗版本號

總結:分層快取架構建議

┌─────────────────────────────────────┐
│           瀏覽器快取 (HTTP Header)   │ ← 靜態資源、ETag/Last-Modified
├─────────────────────────────────────┤
│          CDN 邊緣節點快取            │ ← 全站靜態資源、頁面片段
├─────────────────────────────────────┤
│        Nginx fastcgi/proxy 快取      │ ← 匿名用戶頁面、API 響應
├─────────────────────────────────────┤
│      PHP 進程內快取 (APCu/陣列)      │ ← 配置資料、字典表、熱點計算結果
├─────────────────────────────────────┤
│      分散式快取叢集                 │ ← 用戶 Session、商品詳情、動態列表
├─────────────────────────────────────┤
│           資料庫                    │ ← 持久化存儲、複雜查詢、事務操作
└─────────────────────────────────────┘

快取非銀彈,但設計得當能帶來數量級效能提升。關鍵在於識別熱點、選對介質、定好策略、備好降級。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved