Memcached 是高性能分佈式內存對象緩存系統,廣泛用於減輕數據庫壓力、加速動態 Web 應用。本文介紹 PHP Memcached 擴展的安裝配置與基本數據類型操作示例。
# Ubuntu/Debian
sudo apt install memcached
# CentOS/RHEL
sudo yum install memcached
# 啟動並設置開機自啟
sudo systemctl start memcached
sudo systemctl enable memcached
推薦使用 memcached (libmemcached 基礎) 而非舊版 memcache,功能更豐富、性能更好:
# Ubuntu (PHP 8.1 為例)
sudo apt install php8.1-memcached
# 或通過 PECL 安裝最新版
sudo pecl install memcached
# 編輯 php.ini 添加 extension=memcached.so
php -m | grep memcached
# 輸出 memcached 表示成功
<?php
/**
* Memcached 基本操作演示
* 支援多種數據類型、壓縮、序列化、原子操作
*/
try {
$mem = new Memcached();
// 添加服務器 (支援多台、權重)
$mem->addServer('127.0.0.1', 11211); // 默認權重 0
// $mem->addServer('10.0.0.2', 11211, 10); // 權重 10
// 可選:設置選項
$mem->setOption(Memcached::OPT_COMPRESSION, true); // 啟用壓縮 (大值節省帶寬)
$mem->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY); // 高效序列化
$mem->setOption(Memcached::OPT_BINARY_PROTOCOL, true); // 二進制協議
$mem->setOption(Memcached::OPT_TCP_NODELAY, true); // 降低延遲
$mem->setOption(Memcached::OPT_CONNECT_TIMEOUT, 2000); // 連接超時 2秒
$mem->setOption(Memcached::OPT_RETRY_TIMEOUT, 2); // 重試間隔
echo "連接成功\n";
// --- 1. 字符串操作 ---
$mem->set('str:site', 'PHP技術站', 3600); // 鍵、值、過期時間(秒)
echo "字符串: " . $mem->get('str:site') . "\n";
// --- 2. 數值操作 (原子增減) ---
$mem->set('counter:views', 100);
$mem->increment('counter:views'); // 101
$mem->increment('counter:views', 5); // 106
$mem->decrement('counter:views', 2); // 104
echo "計數器: " . $mem->get('counter:views') . "\n";
// --- 3. 數組/對象 (自動序列化) ---
$user = [
'id' => 1001,
'name' => '張三',
'email' => 'zhangsan@example.com',
'roles' => ['admin', 'editor'],
'profile' => (object)['avatar' => 'avatar.jpg', 'bio' => '開發者']
];
$mem->set('user:1001', $user, 1800); // 30分鐘過期
$cachedUser = $mem->get('user:1001');
echo "用戶對象: " . json_encode($cachedUser, JSON_UNESCAPED_UNICODE) . "\n";
// --- 4. 多鍵批量操作 (減少網絡往返) ---
$data = [
'config:site_name' => 'MySite',
'config:theme' => 'dark',
'config:lang' => 'zh-CN'
];
$mem->setMulti($data, 7200);
$fetched = $mem->getMulti(['config:site_name', 'config:theme']);
echo "批量獲取: " . json_encode($fetched) . "\n";
// --- 5. CAS (檢查並設置) 實現樂觀鎖 ---
$key = 'inventory:product_1';
$mem->set($key, 100);
$casToken = null;
$value = $mem->get($key, null, $casToken); // 獲取值及 CAS 令牌
// 模擬併發修改:只有 CAS 令牌匹配才成功
if ($mem->cas($casToken, $key, $value - 1)) {
echo "庫存扣減成功 (CAS)\n";
} else {
echo "併發衝突,需重試\n";
}
// --- 6. 觸摸/刪除/統計 ---
$mem->touch('str:site', 7200); // 更新過期時間不改值
$mem->delete('str:site');
$stats = $mem->getStats();
echo "服務器統計: " . json_encode($stats) . "\n";
} catch (Exception $e) {
echo "錯誤: " . $e->getMessage() . "\n";
}
| PHP 類型 | 存儲方式 | 注意事項 |
|---|---|---|
| 字符串/整數/浮點數 | 直接存儲 | 高效,支援原子增減 |
| 布爾值/null | 直接存儲 | get 返回原類型 |
| 數組/對象 | 序列化存儲 (igbinary/msgpack/php) | 建議開啟 igbinary 擴展提升性能 |
| 資源 | 不支援 | 資源類型 (如 DB 連接) 無法序列化 |
// 格式:業務模塊:實體類型:ID[:屬性]
// 例子:
'user:info:1001'
'product:detail:SKU12345'
'order:list:user_1001:page_1'
'cache:api:weather:beijing'
// PHP-FPM 模式下自動復用持久連接 (需配置 persistent_id)
$mem = new Memcached('my_pool'); // 同進程內復用
$mem->addServer('127.0.0.1', 11211);
// Swoole/RoadRunner 協程環境需自行管理連接池
PHP Memcached 擴展提供了豐富的 API 支援字符串、數值、數組、對象等多類型存儲,配合原子操作、CAS 樂觀鎖、批量操作、多種序列化器,能滿足絕大多數緩存場景需求。關鍵在於:合理設計鍵名與過期策略、選擇高效序列化器、防範緩存三大經典問題、監控命中率與延遲指標。