環境需求
- PHP 5.3+ (範例為 5.3.3)
- Apache 2.2+ / Nginx
- Memcached Server 1.2.5+ (Windows 執行
memcached.exe -d -install 安裝服務)
- PHP 擴展
php_memcache.dll (對應 VC6/VC9、TS/NTS 版本)
安裝步驟
- 解壓 Memcached,以管理員身分執行
memcached.exe -d -install 安裝為 Windows 服務,再 net start memcached 啟動。
- 將
php_memcache.dll 複製至 PHP ext 目錄。
- 編輯
php.ini,新增 extension="php_memcache.dll",重啟 Apache/Nginx。
- 執行
phpinfo() 搜尋 memcache 確認載入成功。
基本操作範例
<?php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
// 儲存字串
$mem->set('key1', 'This is first value', 0, 60); // flag=0, expire=60秒
echo "Get key1: " . $mem->get('key1') . "<br>";
// 替換
$mem->replace('key1', 'This is replace value', 0, 60);
echo "Get key1: " . $mem->get('key1') . "<br>";
// 儲存陣列 (自動序列化)
$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
print_r($mem->get('key2'));
// 刪除單筆
$mem->delete('key1');
var_dump($mem->get('key1')); // false
// 清空所有
$mem->flush();
var_dump($mem->get('key2')); // false
$mem->close();
?>
實戰場景:資料庫查詢快取
$memcache = new Memcache;
$memcache->connect('192.168.10.1', 11211) or die("Could not connect");
$query = "select * from user limit 10";
$key = md5($query); // 以 SQL 為 key 避免衝突
if (!$data = $memcache->get($key)) {
$conn = mysql_connect("192.168.30.1", "root", "passwd");
mysql_select_db("users");
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result)) $data[] = $row;
$memcache->add($key, serialize($data), 0, 30); // 快取 30 秒
$source = 'db';
} else {
$data = unserialize($data);
$source = 'mem';
}
echo "Data from: $source<br>";
foreach ($data as $row) echo $row['user_id'] . '_' . $row['email'] . "<br>";
新聞系統快取範例 (搭配 Smarty)
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211);
$sql = "SELECT id, title, LEFT(title,16) AS biaoti, date_time FROM p_newsbase WHERE shenhe='1' ORDER BY id DESC LIMIT 7";
$query = $db->query($sql);
$key = md5($sql);
while ($row = $db->fetch_array($query)) {
$sm_news[] = array(
"name" => $row['biaoti'] . $db->time_out($row['date_time']),
"title" => $row['title'],
"id" => $row['id'],
"date_time" => $row['date_time']
);
}
if (!$memcache->get($key)) {
$memcache->add($key, serialize($sm_news), 0, 60);
} else {
$sm_news = unserialize($memcache->get($key));
}
$smarty->assign("sm_news", $sm_news);
進階建議
- Key 設計:使用業務前綴 + MD5(SQL) 或 結構化鍵 (如
user:123:profile) 便於管理與群組失效。
- 序列化:Memcache 原生支援純量/陣列,但複雜物件建議
serialize() / unserialize() 或改用 igbinary、msgpack 提升效能。
- 失效策略:
set 覆蓋、replace 僅存在時更新、add 僅不存在時寫入、delete 主動失效、flush 清空 (慎用)。
- 叢集:生產環境建議使用 Consistent Hashing (如
Memcached::addServer 多節點) 避免單點故障。
- 監控:關注
get_hits, get_misses, evictions 等統計指標調整記憶體與過期時間。