Memcached是一個自由開源的,高性能,分佈式內存對象緩存系統。php
PHP有兩個相關擴展,一個是Memcache,另外一個是Memcached,關於區別,可另行查閱。mysql
本篇以Memcache擴展爲例。sql
PHP程序包默認沒有包含這個擴展,可到 http://pecl.php.net/package/memcache 下載該擴展。數據庫
而後咱們還須要服務器端,可到 http://memcached.org/ 下載服務端。數組
object new Memcache; //返回一個Memcache對象 bool Memcache::connect(string $host, [int $port, int $timeout]); //鏈接到地址爲host端口爲port的memcached服務器 mixed Memcache::pconnect(string $host, [int $port, int $timeout]);//打開一個持久鏈接 在腳本結束或memcache::cache後不會被關閉 //向鏈接池中添加一個Memcache服務器 host指定主機位置 port指定端口 persistent指定是否使用持久鏈接默認true //weight指定此服務器的權重 timeout指定鏈接持續時間默認1秒 retry_interval指定鏈接失敗重試間隔-1表示不重試 //status指定服務器是否能夠被標記爲在線狀態 failure_callback指定發送錯誤後的回調函數 bool Memcache::addServer(string $host, [int $port = 11211, bool $persistent, int $weight, int $timeout, int $retry_interval, bool $status, callback $failure_callback, int $timeoutms]); bool Memcache::close(void); //關閉到服務端的鏈接 不會關閉持久鏈接 持久鏈接只會在服務器關機/重啓時關閉 //將key=>var存儲到服務器 var指定值 字符串和整型被以原文存儲 其它類型序列化後存儲(資源類型不能完整序列化) //flag指定是否使用zlib壓縮 expire指定過時時間 0表示永不過時 能夠設置一個時間戳 或 一個以秒爲單位的時間差(不超過2592000) bool Memcache::add(string $key, mixed $var, [int $flag, int $expire]); //添加一個映射 若是key存在則返回false bool Memcache::set(string $key, mixed $var, [int $flag, int $expire]); //設置一個映射 存在則修改 不存在則建立 bool Memcache::replace(string $key, mixed $var, [int $flag, int $expire]);//修改已存在的映射 不存在返回false string Memcache::get(string $key, [int &$flags]); //返回key對應的存儲的值 若是未找到返回false array Memcache::get(array $key, [int &$flags]); //返回找到的key=>value對數組 bool Memcache::delete(string $key, [int $timeout]); //刪除指定元素key timeout指定多少秒後失效 0當即失效 int Memcache::decrement(string $key, [int $value = 1]); //將key對應的值減去value 成功返回新值 失敗返回false int Memcache::increment(string $key, [int $value = 1]); //將key對應的值加上value 成功返回新值 失敗返回false bool Memcache::flush(void); //刪除全部已經存儲的元素 array Memcache::getStats([string $type, int $slabid, int $limit = 100]); //返回一個服務器統計信息的關聯數組 array Memcache::getExtendedStats([string $type, int $slabid, int $limit = 100]); //返回全部服務器統計信息組成的二維數組 bool Memcache::setServerParams(string $host, [int $port = 11211, int $timeout, int $retry_interval = false bool $status, callback $failure_callback]); //運行時修改服務器參數和狀態
/** * 執行有結果集的SQL語句,並將結果緩存到memcache服務器中 * @author guoguo * @param string $sql 有結果集的查詢語句SQL * @param object $mem memcache類的對象 * @return $data 返回的結果集 */ function select($sql, $mem){ //將md5 sql命令 做爲memcache的惟一標識符 $key = md5($sql); //先從memcached服務器中獲取數據 $data = $mem->get($key); //若是$data不存在 則到數據庫獲取 if(!$data){ try{ $pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '123123'); }catch(PDOException $e){ die('錯誤: '.$e->getMessage()); } $stmt = $pdo->query($sql); $data = $stmt->fetchAll(PDO::FETCH_ASSOC); //將數據緩存到memcached服務器一小時 $mem->add($key, $data, MEMCACHE_COMPRESSED, 3600); } return $data; } $mem = new memcache; $mem->connect('127.0.0.1', 11211); $data = select('SELECT * FROM test', $mem); echo '<pre>'; var_dump($data);
/** * session的memcached驅動 將session存儲到memcache中 */ class Mc{ protected static $prefix; //sessionID前綴 protected static $mem; //session保存的緩存服務器 protected static $lifetime; //session的有效期 //更改默認session存儲方式,使用memcached存儲 public static function start($memcache, $prefix = 'session_'){ self::$mem = $memcache; self::$prefix = $prefix; self::$lifetime = ini_get('session_gc_maxlifetime'); session_set_save_handler( //使用自定義會話存儲函數 [__CLASS__, 'open'], [__CLASS__, 'close'], [__CLASS__, 'read'], [__CLASS__, 'write'], [__CLASS__, 'destroy'], [__CLASS__, 'gc']); } //實現回調函數open public static function open($savePath, $sessionName){ return true; } //實現回調函數read public static function read($sessionID){ return (string)self::$mem->get(self::$prefix.$sessionID); } //實現回調函數write public static function write($sessionID, $data){ return self::$mem->set(self::$prefix.$sessionID, $data, false, self::$lifetime); } //實現回調函數destroy public static function destroy($sessionID){ return self::$mem->delete(self::$prefix.$sessionID); } //實現回調函數gc public static function gc($maxlifetime){ return true; } //實現回調函數close public static function close(){ return true; } } $mem = new memcache; $mem->addServer('127.0.0.1', 11211); //更改session存儲爲memcache Mc::start($mem); //啓動session session_start(); //設置一個session $_SESSION['name'] = 'hello world!'; echo $_SESSION['name'];
Memcached服務器結果以下:緩存