前言
Memcache 是高效能分散式記憶體快取系統,PHP Memcache 類別提供 25 個核心方法。本文將其分為連線管理、資料操作、伺服器管理、統計監控四大類,附上方法簽名、參數說明與實戰提示,作為開發時的桌邊速查手冊。
類別方法總覽
連線管理
| 方法 | 簽名 | 說明 | 實戰提示 |
| connect | connect(string $host, int $port, int $timeout=1) | 建立非持久連線 | 短生命週期腳本適用;失敗拋 Exception |
| pconnect | pconnect(string $host, int $port, int $timeout=1) | 建立持久連線 | FPM/常駐進程必用;進程間共用連線池 |
| close | close() | 關閉連線 | 腳本結束自動釋放,長腳本建議顯式呼叫 |
| addServer | addServer(string $host, int $port, bool $persistent, int $weight, int $timeout, int $retry_interval, bool $status, callable $failure_callback) | 加入伺服器池 | 多伺服器叢集必呼叫;weight 決定分流權重 |
| setServerParams | setServerParams(string $host, int $port, int $timeout, int $retry_interval, bool $status, callable $failure_callback) | 運行時修改伺服器參數 | 動態下線/上線節點、調整權重 |
資料操作(核心 CRUD)
| 方法 | 簽名 | 說明 | 實戰提示 |
| set | set(string $key, mixed $var, int $flag=0, int $expire=0) | 儲存/覆蓋資料 | $expire=0 為永不過期;大物件設 flag=MEMCACHE_COMPRESSED |
| add | add(string $key, mixed $var, int $flag=0, int $expire=0) | 僅當 key 不存在時新增 | 防止併發覆蓋;失敗回傳 false |
| replace | replace(string $key, mixed $var, int $flag=0, int $expire=0) | 僅當 key 存在時更新 | 配合 CAS 機制實現樂觀鎖 |
| get | get(string $key, int &$flags=null) | 取得單一 key | 不存在回傳 false;$flags 取得壓縮標記 |
| delete | delete(string $key, int $timeout=0) | 刪除 key | $timeout>0 延遲刪除(舊版本支援) |
| increment | increment(string $key, int $value=1) | 原子遞增數值 | 計數器、排行榜首選;key 必須為整數 |
| decrement | decrement(string $key, int $value=1) | 原子遞減數值 | 同上,防止負數需自行檢查 |
| flush | flush() | 清空所有資料 | 極度危險!僅限測試環境或重大版本發布 |
進階資料操作
| 方法 | 簽名 | 說明 |
| getExtendedStats | getExtendedStats(string $type, int $slab_id, int $limit=100) | 取得詳細 slab 統計 |
| setCompressThreshold | setCompressThreshold(int $threshold, float $min_savings=0.2) | 啟用大值自動壓縮 |
統計監控與除錯
| 方法 | 簽名 | 說明 | 關鍵指標 |
| getStats | getStats(string $type=null, int $slab_id=null, int $limit=100) | 取得伺服器統計 | curr_items, bytes, curr_connections, get_hits, get_misses, evictions |
| getServerStatus | getServerStatus(string $host, int $port) | 取得單節點上線狀態 | 回傳 0/1;健康檢查必備 |
| getVersion | getVersion() | 取得伺服器版本 | 相容性檢查 |
函數式介面(單一函數)
memcache_debug(bool $on_off) // 開啟/關閉除錯輸出,僅除錯用
實戰最佳實踐
1. 連線池配置範例
$mem = new Memcache();
$mem->addServer('10.0.0.1', 11211, true, 50, 1, 15, true); // 主節點權重 50
$mem->addServer('10.0.0.2', 11211, true, 30, 1, 15, true); // 備用權重 30
$mem->addServer('10.0.0.3', 11211, true, 20, 1, 15, true); // 備用權重 20
// 總權重 100,請求按權重分流
2. 取得命中率監控
$stats = $mem->getStats();
$hits = $stats['get_hits'];
$misses = $stats['get_misses'];
$hitRate = $hits / ($hits + $misses) * 100;
echo "快取命中率: " . number_format($hitRate, 2) . "%\n";
// 生產環境建議 > 95%
3. 原子計數器模式
$key = 'page_view:' . $articleId;
$views = $mem->increment($key);
if ($views === false) {
// key 不存在,初始化
$mem->set($key, 1);
$views = 1;
}
4. 防止快取穿透/雪崩
- 穿透:查詢不存在 key 時,
set($key, 'NULL_MARKER', 0, 60) 快取空值 60 秒。
- 雪崩:大量 key 同時間過期 →
$expire = 3600 + rand(0, 300) 加入隨機抖動。
常見陷阱
- ❌ 使用
get 判斷存在性 → 會反序列化大物件浪費 CPU。
✅ 用 $mem->get($key) !== false 或維護獨立 exists 集合。
- ❌ 儲存資源型別、物件含閉包 → 無法序列化。
✅ 只存純資料陣列/標量,或自行 serialize() 後存字串。
- ❌ 單一大 key 超過 1MB → 網路傳輸阻塞。
✅ 拆分為多個小 key,或啟用 setCompressThreshold(10240, 0.2)。
相關專題推薦
熟練掌握這 25 個核心方法,能讓你在高併發場景下靈活運用 Memcache 解決熱點資料存取、計數器、分散式 Session、鎖等經典問題。建議列印本表貼在工位,需要時秒級查閱。