Thinkphp 3.2.3 redis缓存

我的博客

说明

好像是tp3.2的bug,自带的redis驱动不是那么好用。。。找了方法修改优化了一下,亲测可用。

  1. 确认已经安装了redis服务器
  1. 确认php中已经安装了redis扩展
  2. TP版本:thinkphp_3.2.3_full.zip

S缓存使用redis

复制以下内容到文本中,改名为Redis.class.php。
替换ThinkPHP\Library\Think\Cache\Driver\Redis.class.php(注意先备份)

 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参数
        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数据 true 返回JSON解析数组, false返回源数据
    }

    /**
     * 写入缓存
     * @access public
     * @param string $name 缓存变量名
     * @param mixed $value  存储数据
     * @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;
        //对数组/对象数据进行缓存处理,保证数据完整性
        $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();
    }

}

Thinkphp 3.2.3 redis缓存_第1张图片

SESSION使用redis

复制以下内容到文本中,改名为Redis.class.php。
复制到ThinkPHP\Library\Think\Session\Driver\Redis.class.php

 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服务端
     * @access public
     * @param bool $is_master : 是否连接主服务器
     */
    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);   //多个从服务器随机选择
            }
        }
        $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().'
Error Code:'.$e->getCode().''); } } /** +---------------------------------------------------------- * 打开Session +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $savePath * @param mixed $sessName +---------------------------------------------------------- */ public function open($savePath, $sessName) { return true; } /** +---------------------------------------------------------- * 关闭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(); } }
Thinkphp 3.2.3 redis缓存_第2张图片

config 配置

    //SESSION 配置
    'SESSION_AUTO_START' => true, //是否开启session
    'SESSION_TYPE'          =>  'Redis',    //session 驱动
    'SESSION_PREFIX'        =>  'sess_',    //session前缀
    'SESSION_EXPIRE'        =>  '7200',        //session有效期(单位:秒) 0表示永久缓存,当session被访问时,时间重新计算。
    
    //缓存 配置
    'DATA_CACHE_TYPE'=>'Redis',//默认动态缓存为Redis
    'DATA_CACHE_PREFIX' => 'Redis_',//缓存前缀
    'DATA_CACHE_TIME'       =>  '0',    //缓存时间 0为永久 当缓存被访问时,时间不重新计算
    
    //Redis 配置
    'REDIS_RW_SEPARATE' => true, //Redis读写分离 true 开启
    'REDIS_HOST'=>'127.0.0.1', //redis服务器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缓存:";
        dump(S('test'));
        echo "SESSION:";
        dump($_SESSION['test']);

        exit;
}
Thinkphp 3.2.3 redis缓存_第3张图片

使用redis管理工具查看


Thinkphp 3.2.3 redis缓存_第4张图片

你可能感兴趣的:(Thinkphp 3.2.3 redis缓存)