首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP Memcache 擴展安裝與實戰應用完整指南

     編輯:PHP 綜合知識

環境需求

  • 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 版本)

安裝步驟

  1. 解壓 Memcached,以管理員身分執行 memcached.exe -d -install 安裝為 Windows 服務,再 net start memcached 啟動。
  2. 將 php_memcache.dll 複製至 PHP ext 目錄。
  3. 編輯 php.ini,新增 extension="php_memcache.dll",重啟 Apache/Nginx。
  4. 執行 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 等統計指標調整記憶體與過期時間。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved