Memcached 是一套高效能、分散式的記憶體物件快取系統。它在記憶體中維護一個巨大的 Hash Table,由 memcached 守護程式管理,讓應用程式能以極低延遲存取鍵值資料,大幅減輕資料庫負載。
memcache(較舊、功能較少)。memcached(較新、支援完整協定、二進制協定、SASL 認證等)。建議新專案使用 memcached 擴展。get)。set),再回傳給應用程式。# 1. 安裝相依套件
sudo yum install -y libevent-devel gcc make # CentOS/RHEL
# sudo apt-get install -y libevent-dev build-essential # Debian/Ubuntu
# 2. 下載原始碼並編譯(以 1.6.21 為例)
wget https://memcached.org/files/memcached-1.6.21.tar.gz
tar -zxvf memcached-1.6.21.tar.gz
cd memcached-1.6.21
./configure --prefix=/usr/local/memcached
make && sudo make install
# 3. 建立系統服務(systemd)
sudo tee /etc/systemd/system/memcached.service <<'EOF'
[Unit]
Description=Memcached
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/memcached/bin/memcached -u memcached -m 256 -p 11211 -l 127.0.0.1 -c 1024
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 4. 建立執行用戶並啟動
sudo useradd -r -s /sbin/nologin memcached
sudo systemctl daemon-reload
sudo systemctl enable --now memcached
systemctl status memcached
| 參數 | 說明 | 預設值 |
|---|---|---|
-p | TCP 監聽埠 | 11211 |
-l | 綁定 IP 位址 | 127.0.0.1 |
-d | 以 daemon 模式背景執行 | - |
-u | 執行身分(需 root 啟動時指定) | - |
-m | 最大記憶體用量(MB) | 64 |
-M | 記憶體耗盡時回傳錯誤而非淘汰舊資料 | 關閉 |
-c | 最大同時連線數 | 1024 |
-f | 記憶體區塊增長因子 | 1.25 |
-n | 最小配置空間(bytes,含 key+value+flags) | 48 |
-t | 工作執行緒數 | 4 |
-v/-vv/-vvv | 詳細輸出等級 | - |
# 安裝 libmemcached 函式庫
sudo yum install -y libmemcached-devel # CentOS
# sudo apt-get install -y libmemcached-dev # Ubuntu
# 安裝 PHP 擴展 (假設 PHP 8.2)
pecl install memcached
# 編譯過程中會詢問是否支援 json, igbinary, msgpack 等序列化,建議全選 y
# 在 php.ini 加入
extension=memcached.so
# 重啟 php-fpm
sudo systemctl restart php-fpm
<?php
$mc = new Memcached();
$mc->addServer('127.0.0.1', 11211);
// 設定序列化器(建議 igbinary 效能較好)
$mc->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY);
// 連線逾時與重試
$mc->setOption(Memcached::OPT_CONNECT_TIMEOUT, 1000); // 1 秒
$mc->setOption(Memcached::OPT_RETRY_TIMEOUT, 1); // 1 秒後重試
$mc->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT); // 一致性雜湊
$mc->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE, true); // 相容 ketama 演算法
// 寫入快取(過期時間 300 秒)
$key = 'user:profile:1001';
$data = ['id' => 1001, 'name' => 'Alice', 'email' => 'alice@example.com'];
$mc->set($key, $data, 300);
// 讀取快取
$cached = $mc->get($key);
if ($cached !== false) {
echo "快取命中: ";
print_r($cached);
} else {
echo "快取未命中,查詢資料庫...";
// $data = $db->query(...);
// $mc->set($key, $data, 300);
}
// 刪除快取
$mc->delete($key);
// 批次操作
$mc->setMulti(['key1' => 'val1', 'key2' => 'val2'], 60);
$vals = $mc->getMulti(['key1', 'key2', 'key3']);
print_r($vals);
// 原子遞增/遞減(計數器)
$mc->set('counter:pageview', 0);
$mc->increment('counter:pageview');
$mc->decrement('counter:pageview');
add 成功者重建快取,其等待)或邏輯過期(資料內含過期時間,背景非同步更新)。expire + rand(0, 300))、多級快取(本機記憶體 + Memcached)。# 即時統計
memcached-tool 127.0.0.1:11211 stats
# 關鍵指標:get_hits, get_misses, evictions, bytes, curr_connections, limit_maxbytes
# 命中率 = get_hits / (get_hits + get_misses) * 100%
# 建議維持 90% 以上;evictions > 0 表示記憶體不足需擴容或優化 key 大小
-I 啟動參數調大至 128 MB)。memcached 擴展預設使用 igbinary 序列化,確保所有節點版本一致,避免反序列化失敗。OPT_DISTRIBUTION),否則增減節點會導致大量快取失效。掌握 Memcached 核心概念與操作細節,能為 PHP 應用帶來數量級的效能提升,是高併發架構不可或缺的基石組件。