PHP之Memcached

Memcached是一個自由開源的,高性能,分佈式內存對象緩存系統。php

PHP有兩個相關擴展,一個是Memcache,另外一個是Memcached,關於區別,可另行查閱。mysql

本篇以Memcache擴展爲例。sql

PHP程序包默認沒有包含這個擴展,可到 http://pecl.php.net/package/memcache 下載該擴展。數據庫

而後咱們還須要服務器端,可到 http://memcached.org/ 下載服務端。數組

下面是PHP中該擴展相關的方法。

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);

使用Memcached存儲sessioin

/**
     * 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服務器結果以下:緩存

相關文章
相關標籤/搜索