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

PHP 高效能快取策略:Nginx proxy_cache/fastcgi_cache、Memcache 與 MySQL 記憶體表實戰

     編輯:PHP 綜合知識

前言

快取是高併發系統的核心支柱。本文系統整理 Nginx 兩大快取模組、Memcache 分散式快取、MySQL 記憶體表三大層面的配置、原理與選型建議。

一、 Nginx 快取:proxy_cache vs fastcgi_cache

核心差異

特性proxy_cachefastcgi_cache
快取對象上游伺服器回應(靜態/動態皆可)FastCGI 應用產生的內容(通常為 PHP 動態頁)
減少通訊Nginx ↔ 上游Nginx ↔ PHP-FPM
減輕壓力上游伺服器、網路傳輸PHP 進程、資料庫
適用場景反向代理、CDN 邊緣、微服務網關PHP 動態頁面整頁快取

proxy_cache 完整配置範例

# http 區塊
proxy_temp_path  /var/cache/nginx/proxy_temp;
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_cache cache_one;
        proxy_cache_valid 200 304 12h;
        proxy_cache_key $host$uri$is_args$args;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_pass https://backend;
        expires 1d;
    }

    # 手動清除快取:訪問 /purge/實際路徑
    location ~ /purge(/.*) {
        allow 127.0.0.1;
        allow 192.168.0.0/16;
        deny all;
        proxy_cache_purge cache_one $host$1$is_args$args;
    }

    # 動態頁不快取
    location ~ \.(php|jsp|cgi)$ {
        proxy_pass https://backend;
    }
}

fastcgi_cache 完整配置範例

# http 區塊
fastcgi_cache_path /var/cache/nginx/fastcgi_cache levels=1:2 keys_zone=php_cache:500m inactive=2d max_size=10g;
fastcgi_cache_key "$scheme$request_method$host$uri$arg_filename$arg_x$arg_y";

server {
    listen 8080;
    server_name www.example.com;

    location / {
        root /var/www;
        index index.php index.html;
    }

    location ~ \.php$ {
        root /var/www;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_cache php_cache;
        fastcgi_cache_valid 200 48h;
        fastcgi_cache_min_uses 1;
        fastcgi_cache_use_stale error timeout invalid_header http_500;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        # 允許 Set-Cookie 穿透(預設快取會隱藏)
        fastcgi_pass_header Set-Cookie;
    }
}

關鍵指令說明

  • levels=1:2:兩級子目錄結構,避免單目錄檔案過多影響檔案系統效能。
  • keys_zone=name:size:共享記憶體區名稱與大小,存放快取索引(Key->Metadata)。
  • inactive=1d:未被訪問 1 天自動刪除。
  • max_size=30g:磁碟快取上限,超過按 LRU 淘汰。
  • proxy_cache_purge / fastcgi_cache_purge:需編譯 ngx_cache_purge 模組或使用 OpenResty。

二、 Memcache 分散式記憶體快取

核心定位

  • 提升系統並發能力(減少 DB 直連)。
  • 減輕資料庫負擔(熱點資料記憶體直讀)。

關鍵限制

  • 32 位系統單進程最大 4GB 記憶體。
  • 單項最大 1MB(可調 -I 參數)。
  • Key 長度 ≤ 250 字元。
  • 最長過期時間 30 天(Unix timestamp 或相對秒數)。
  • 無持久化、無備份、無原生叢集(一致性哈希由客戶端實現)。

典型架構

PHP App -> Memcache Client (Consistent Hashing) -> Memcache Server Pool (多節點)

三、 MySQL 記憶體表

建立語法

CREATE TABLE `session_cache` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `session_key` CHAR(32) NOT NULL,
  `data` MEDIUMTEXT NOT NULL,
  `expire` INT UNSIGNED NOT NULL
) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;

特性對照

特性MEMORY 表臨時表
資料儲存記憶體記憶體(超過 tmp_table_size 轉磁碟)
重啟後結構保留(.frm),資料遺失完全消失
支援 BLOB/TEXT不支援支援
索引類型Hash (預設) / B-TreeB-Tree
鎖粒度表鎖表鎖
事務不支援不支援

適用場景

  • Session 儲存(高頻讀寫、可容忍重啟遺失)。
  • 熱點計數器、排行榜、配置快取。
  • 資料量較小、結構固定、極高 QPS 需求。

四、 選型建議

  1. 整頁靜態/半靜態: Nginx fastcgi_cache(最簡單、效能最高、無代碼改動)。
  2. API 介面、片段資料: Memcache/Redis(支援複雜資料結構、TTL、分散式)。
  3. 極高頻計數/Session: MySQL MEMORY 表或 Redis(Redis 持久化更安全)。
  4. 多層快取: 瀏覽器快取 → CDN/Ngx proxy_cache → Ngx fastcgi_cache → Redis/Memcache → DB。

結語

快取無銀彈,關鍵在於識別熱點、選對層級、設定合理 TTL、監控命中率。Nginx 兩大快取模組配置相似,核心差異在於快取對象與減壓層級;Memcache 適合分散式簡單 KV;MEMORY 表適合特定高頻小表。實務中常組合使用,構建多層防禦體系。

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