# 依賴 libevent wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz tar xzf libevent-*.tar.gz && cd libevent-* && ./configure --prefix=/usr && make && make install # Memcached wget https://memcached.org/latest -O memcached.tar.gz tar xzf memcached.tar.gz && cd memcached-* ./configure --prefix=/usr && make && make install
/usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u www-data # -d 背景運行 -m 內存MB -l 監聽IP -p 端口 -u 用戶
| 方案 | 優點 | 缺點 |
|---|---|---|
| php-memcached 擴展 (libmemcached) | 性能最佳、功能完整 | 需編譯安裝 |
| php-memcache 擴展 | 較輕量 | 功能較少、已停止維護 |
| 純 PHP 客戶端 (php-memcached-client) | 免編譯、部署簡單 | 性能較差 |
本文示範純 PHP 客戶端(Memcached.php)。
require_once 'Memcached.php';
$mc = new Memcached([
'servers' => ['192.168.1.1:11211'],
'compress_threshold' => 10240,
'persistent' => false,
]);
$key = 'mykey';
$mc->add($key, 'Hello Memcached');
var_dump($mc->get($key));
$mc->replace($key, ['arr'=>123]);
var_dump($mc->get($key));
$mc->delete($key);
var_dump($mc->get($key)); // false
$sql = 'SELECT * FROM users WHERE status=1';
$key = md5($sql);
if (!($data = $mc->get($key))) {
echo "從 MySQL 讀取\n";
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$data = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);
$mc->add($key, $data, 300); // 緩存 5 分鐘
} else {
echo "從 Memcached 讀取\n";
}
print_r($data);
session.save_handler=memcached、session.save_path="192.168.1.1:11211"user:123:profile