Yii 內建 CMemCache 元件支援 Memcached,本文記錄從安裝 Memcached 服務到 Yii 配置、基本操作的完整步驟。
> memcached.exe -d install # 安裝為服務
> memcached.exe -d start # 啟動服務
# 預設監聽 127.0.0.1:11211
Linux 生產環境建議用套件管理安裝:apt install memcached / yum install memcached,並調整 /etc/memcached.conf 記憶體上限 (-m 256) 與監聽介面。
<?php
return [
// ...
'components' => [
// ...
'memcache' => [
'class' => 'CMemCache',
'servers' => [
[
'host' => '127.0.0.1',
'port' => 11211,
'weight' => 60,
],
[
'host' => '127.0.0.1',
'port' => 11211,
'weight' => 40,
],
// 可加入多台 Server 組成叢集
],
// 可選參數
'keyPrefix' => 'myapp_', // 鍵前綴,避免衝突
'hashKey' => true, // 鍵過長時自動雜湊
'serializer' => 'igbinary', // 需安裝 igbinary 擴充,序列化更快
],
],
];
| 操作 | 代碼範例 | 說明 |
|---|---|---|
| 寫入 | Yii::app()->memcache->set($id, $value, $expire=0) | $expire 秒數,0=永不過期 |
| 讀取 | Yii::app()->memcache->get($id) | 不存在回傳 false |
| 刪除 | Yii::app()->memcache->delete($id) | |
| 檢查存在 | Yii::app()->memcache->get($id) !== false | |
| 遞增/遞減 | increment($id, $step=1) / decrement($id, $step=1) | 原子操作,適合計數器 |
| 清空所有 | Yii::app()->memcache->flush() | 謹慎使用 |
public function getHotArticles($limit = 10) {
$key = "hot_articles_{$limit}";
$data = Yii::app()->memcache->get($key);
if ($data === false) {
$data = Article::model()->published()
->orderBy('views DESC')
->limit($limit)
->findAll();
Yii::app()->memcache->set($key, $data, 300); // 快存 5 分鐘
}
return $data;
}
php-memcached (libmemcached 為底) 或 php-memcache (舊版),前者功能較完整、支援 SASL、Binary Protocol。serialize(),大物件建議 igbinary 或 msgpack。v2:user:123)、避免過長 (>250 bytes)。delete、或短 TTL + 被動更新、或標記版本號。stats 指令觀察 get_hits/get_misses、evictions、記憶體使用率。CMemCache 內建一致性雜湊分發,weight 決定節點權重。新增/移除節點時,只有小部分 Key 會重新分發,減少快取失效風暴。
'servers' => [
['host' => '10.0.1.10', 'port' => 11211, 'weight' => 50],
['host' => '10.0.1.11', 'port' => 11211, 'weight' => 50],
['host' => '10.0.1.12', 'port' => 11211, 'weight' => 30], // 新節點權重較低緩衝
],
配合 ketama 演算法 (libmemcached 預設) 可獲得更平滑的分發。