Thinkphp 3.2.3 redis緩存

我的博客:https://blog.thuol.com

說明

好像是tp3.2的bug,自帶的redis驅(qū)動不是那么好用暮的。是偷。具篇。找了方法修改優(yōu)化了一下纬霞,親測可用。

  1. 確認已經(jīng)安裝了redis服務(wù)器
  1. 確認php中已經(jīng)安裝了redis擴展
  2. TP版本:thinkphp_3.2.3_full.zip

S緩存使用redis

復(fù)制以下內(nèi)容到文本中驱显,改名為Redis.class.php诗芜。
替換ThinkPHP\Library\Think\Cache\Driver\Redis.class.php(注意先備份)

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2013 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
namespace Think\Cache\Driver;
use Think\Cache;
defined('THINK_PATH') or exit();

/**
 * Redis緩存驅(qū)動
 */
class Redis extends Cache {
    /**
     * 架構(gòu)函數(shù)
     * @param array $options 緩存參數(shù)
     * @access public
     */
    public function __construct($options=array()) {
        if ( !extension_loaded('redis') ) {
            E(L('_NOT_SUPPERT_').':redis');
        }
        if(empty($options)) {
            $options = array (
                'host'          => C('REDIS_HOST') ? C('REDIS_HOST') : '127.0.0.1',
                'port'          => C('REDIS_PORT') ? C('REDIS_PORT') : 6379,
                'timeout'       => C('REDIS_TIMEOUT') ? C('REDIS_TIMEOUT') : false,
                'auth'      => C('REDIS_AUTH') ? C('REDIS_AUTH'):null,//auth認證
                'persistent'    => C('REDIS_PERSISTENT') ? C('REDIS_PERSISTENT') : false,
            );
        }
        $this->options =  $options;
        $this->options['expire'] =  isset($options['expire'])?  $options['expire']  :   C('DATA_CACHE_TIME');
        $this->options['prefix'] =  isset($options['prefix'])?  $options['prefix']  :   C('DATA_CACHE_PREFIX');
        $this->options['length'] =  isset($options['length'])?  $options['length']  :   0;
        $func = $options['persistent'] ? 'pconnect' : 'connect';
        $this->handler  = new \Redis;
        $options['timeout'] === false ?
            $this->handler->$func($options['host'], $options['port']) :
            $this->handler->$func($options['host'], $options['port'], $options['timeout']);

        //Auth參數(shù)
        if($this->options['auth']!=null)
        {
            $this->handler->auth($this->options['auth']);
        }
    }

    /**
     * 讀取緩存
     * @access public
     * @param string $name 緩存變量名
     * @return mixed
     */
    public function get($name) {
        N('cache_read',1);
        $value = $this->handler->get($this->options['prefix'].$name);
        $jsonData  = json_decode( $value, true );
        return ($jsonData === NULL) ? $value : $jsonData;   //檢測是否為JSON數(shù)據(jù) true 返回JSON解析數(shù)組, false返回源數(shù)據(jù)
    }

    /**
     * 寫入緩存
     * @access public
     * @param string $name 緩存變量名
     * @param mixed $value  存儲數(shù)據(jù)
     * @param integer $expire  有效時間(秒)
     * @return boolean
     */
    public function set($name, $value, $expire = null) {
        N('cache_write',1);
        if(is_null($expire)) {
            $expire  =  $this->options['expire'];
        }
        $name   =   $this->options['prefix'].$name;
        //對數(shù)組/對象數(shù)據(jù)進行緩存處理瞳抓,保證數(shù)據(jù)完整性
        $value  =  (is_object($value) || is_array($value)) ? json_encode($value) : $value;
        if(is_int($expire)) {
            $result = $this->handler->setex($name, $expire, $value);
        }else{
            $result = $this->handler->set($name, $value);
        }
        if($result && $this->options['length']>0) {
            // 記錄緩存隊列
            $this->queue($name);
        }
        return $result;
    }

    /**
     * 刪除緩存
     * @access public
     * @param string $name 緩存變量名
     * @return boolean
     */
    public function rm($name) {
        return $this->handler->delete($this->options['prefix'].$name);
    }

    /**
     * 清除緩存
     * @access public
     * @return boolean
     */
    public function clear() {
        return $this->handler->flushDB();
    }

}

SESSION使用redis

復(fù)制以下內(nèi)容到文本中,改名為Redis.class.php伏恐。
復(fù)制到ThinkPHP\Library\Think\Session\Driver\Redis.class.php

<?php

/**
 *  +----------------------------------------------------------------------
 *  | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
 *  +----------------------------------------------------------------------
 *  | Copyright (c) 2006-2013 http://thinkphp.cn All rights reserved.
 *  +----------------------------------------------------------------------
 *  | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
 *  +---------------------------------------------------------------------- 
 */

namespace Think\Session\Driver;

/**
 * Redis Session驅(qū)動 
 */
class Redis {
    
    /**
     * Redis句柄
     */
    private $handler;
    private $get_result;

    public function __construct(){
        if ( !extension_loaded('redis') ) {
            E(L('_NOT_SUPPERT_').':redis');
        }
        if(empty($options)) {
            $options = array (
                'host'          => C('REDIS_HOST') ? C('REDIS_HOST') : '127.0.0.1',
                'port'          => C('REDIS_PORT') ? C('REDIS_PORT') : 6379,
                'timeout'       => C('REDIS_TIMEOUT') ? C('REDIS_TIMEOUT') : false,
                'persistent'    => C('REDIS_PERSISTENT') ? C('REDIS_PERSISTENT') : false,
        'auth'      => C('REDIS_AUTH') ? C('REDIS_AUTH') : false,
            );
        }
        $options['host'] = explode(',', $options['host']);
        $options['port'] = explode(',', $options['port']);
        $options['auth'] = explode(',', $options['auth']);
        foreach ($options['host'] as $key=>$value) {
            if (!isset($options['port'][$key])) {
                $options['port'][$key] = $options['port'][0];
            }
            if (!isset($options['auth'][$key])) {
                $options['auth'][$key] = $options['auth'][0];
            }
        }
        $this->options =  $options;
    $expire = C('SESSION_EXPIRE');
        $this->options['expire'] =  isset($expire) ? (int)$expire : (int)ini_get('session.gc_maxlifetime');;
        $this->options['prefix'] =  isset($options['prefix']) ?  $options['prefix']  :   C('SESSION_PREFIX');
        $this->handler  = new \Redis;
    }

    /**
     * 連接Redis服務(wù)端
     * @access public
     * @param bool $is_master : 是否連接主服務(wù)器
     */
    public function connect($is_master = true) {
        if ($is_master) {
            $i = 0;
        } else {
            $count = count($this->options['host']);
            if ($count == 1) {
                $i = 0;
            } else {
                $i = rand(1, $count - 1);   //多個從服務(wù)器隨機選擇
            }
        }
        $func = $this->options['persistent'] ? 'pconnect' : 'connect';
        try {
            if ($this->options['timeout'] === false) {
                $result = $this->handler->$func($this->options['host'][$i], $this->options['port'][$i]);
                if (!$result)
                    throw new \Think\Exception('Redis Error', 100);
            } else {
                $result = $this->handler->$func($this->options['host'][$i], $this->options['port'][$i], $this->options['timeout']);
                if (!$result)
                    throw new \Think\Exception('Redis Error', 101);
            }
            if ($this->options['auth'][$i]) {
                $result = $this->handler->auth($this->options['auth'][$i]);
                if (!$result) {
                    throw new \Think\Exception('Redis Error', 102);
                }
            }
        } catch ( \Exception $e ) {
            exit('Error Message:'.$e->getMessage().'<br>Error Code:'.$e->getCode().'');
        }
    }
    
    /**
      +----------------------------------------------------------
     * 打開Session 
      +----------------------------------------------------------
     * @access public 
      +----------------------------------------------------------
     * @param string $savePath 
     * @param mixed $sessName  
      +----------------------------------------------------------
     */
    public function open($savePath, $sessName) {
        return true;
    }
    
    /**
      +----------------------------------------------------------
     * 關(guān)閉Session 
      +----------------------------------------------------------
     * @access public 
      +----------------------------------------------------------
     */
    public function close() {
        if ($this->options['persistent'] == 'pconnect') {
            $this->handler->close();
        }
        return true;
    }

    /**
      +----------------------------------------------------------
     * 讀取Session 
      +----------------------------------------------------------
     * @access public 
      +----------------------------------------------------------
     * @param string $sessID 
      +----------------------------------------------------------
     */
    public function read($sessID) {
        $this->connect(0);
        $this->get_result = $this->handler->get($this->options['prefix'].$sessID);
        //延長有效期
        $this->handler->expire($this->options['prefix'].$sessID,C('SESSION_EXPIRE'));
        return $this->get_result;
    }

    /**
      +----------------------------------------------------------
     * 寫入Session 
      +----------------------------------------------------------
     * @access public 
      +----------------------------------------------------------
     * @param string $sessID 
     * @param String $sessData  
      +----------------------------------------------------------
     */
    public function write($sessID, $sessData) {
        if (!$sessData || $sessData == $this->get_result) {
            return true;
        }
        $this->connect(1);
        $expire  =  $this->options['expire'];
        $sessID   =   $this->options['prefix'].$sessID;
        if(is_int($expire) && $expire > 0) {
            $result = $this->handler->setex($sessID, $expire, $sessData);
            $re = $result ? 'true' : 'false';
        }else{
            $result = $this->handler->set($sessID, $sessData);
            $re = $result ? 'true' : 'false';
        }
        return $result;
    }

    /**
      +----------------------------------------------------------
     * 刪除Session 
      +----------------------------------------------------------
     * @access public 
      +----------------------------------------------------------
     * @param string $sessID 
      +----------------------------------------------------------
     */
    public function destroy($sessID) {
        $this->connect(1);
        return $this->handler->delete($this->options['prefix'].$sessID);
    }

    /**
      +----------------------------------------------------------
     * Session 垃圾回收
      +----------------------------------------------------------
     * @access public 
      +----------------------------------------------------------
     * @param string $sessMaxLifeTime 
      +----------------------------------------------------------
     */
    public function gc($sessMaxLifeTime) {
        return true;
    }

    /**
      +----------------------------------------------------------
     * 打開Session 
      +----------------------------------------------------------
     * @access public 
      +----------------------------------------------------------
     * @param string $savePath 
     * @param mixed $sessName  
      +----------------------------------------------------------
     */
    public function execute() {
        session_set_save_handler(
                array(&$this, "open"),
                array(&$this, "close"),
                array(&$this, "read"),
                array(&$this, "write"),
                array(&$this, "destroy"),
                array(&$this, "gc")
        );
    }
    
    public function __destruct() {
        if ($this->options['persistent'] == 'pconnect') {
            $this->handler->close();
        }
        session_write_close();
    }

}

config 配置

    //SESSION 配置
    'SESSION_AUTO_START' => true, //是否開啟session
    'SESSION_TYPE'          =>  'Redis',    //session 驅(qū)動
    'SESSION_PREFIX'        =>  'sess_',    //session前綴
    'SESSION_EXPIRE'        =>  '7200',        //session有效期(單位:秒) 0表示永久緩存孩哑,當session被訪問時,時間重新計算翠桦。
    
    //緩存 配置
    'DATA_CACHE_TYPE'=>'Redis',//默認動態(tài)緩存為Redis
    'DATA_CACHE_PREFIX' => 'Redis_',//緩存前綴
    'DATA_CACHE_TIME'       =>  '0',    //緩存時間 0為永久 當緩存被訪問時横蜒,時間不重新計算
    
    //Redis 配置
    'REDIS_RW_SEPARATE' => true, //Redis讀寫分離 true 開啟
    'REDIS_HOST'=>'127.0.0.1', //redis服務(wù)器ip,多臺用逗號隔開销凑;讀寫分離開啟時丛晌,第一臺負責寫,其它[隨機]負責讀斗幼;
    'REDIS_PORT'=>'6379',//端口號
    'REDIS_TIMEOUT'=>'30',//超時時間(秒)
    'REDIS_PERSISTENT'=>false,//是否長連接 false=短連接
    'REDIS_AUTH'=>'123456',//AUTH認證密碼

測試

public function index(){
        $test['a']='123';
        $test['b']='1234';
        $test['c']['a']='ca123';
        $test['c']['b']='cb123';
        
        S('test',$test);
        $_SESSION['test']=$test;
        
        echo "S緩存:</ br>";
        dump(S('test'));
        echo "SESSION:</ br>";
        dump($_SESSION['test']);

        exit;
}

使用redis管理工具查看


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澎蛛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜕窿,更是在濱河造成了極大的恐慌谋逻,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桐经,死亡現(xiàn)場離奇詭異毁兆,居然都是意外死亡,警方通過查閱死者的電腦和手機次询,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門荧恍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屯吊,你說我怎么就攤上這事送巡。” “怎么了盒卸?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵骗爆,是天一觀的道長。 經(jīng)常有香客問我蔽介,道長摘投,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任虹蓄,我火速辦了婚禮犀呼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薇组。我一直安慰自己外臂,他們只是感情好,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布律胀。 她就那樣靜靜地躺著宋光,像睡著了一般貌矿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罪佳,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天逛漫,我揣著相機與錄音,去河邊找鬼赘艳。 笑死酌毡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的蕾管。 我是一名探鬼主播阔馋,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼娇掏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起勋眯,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤婴梧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后客蹋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塞蹭,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年讶坯,在試婚紗的時候發(fā)現(xiàn)自己被綠了番电。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡辆琅,死狀恐怖漱办,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婉烟,我是刑警寧澤娩井,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站似袁,受9級特大地震影響洞辣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昙衅,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一扬霜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧而涉,春花似錦著瓶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躯泰。三九已至,卻和暖如春华糖,著一層夾襖步出監(jiān)牢的瞬間麦向,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工客叉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诵竭,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓兼搏,卻偏偏與公主長得像卵慰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子佛呻,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容