转载 00天火00 文章保存一下先。。
说明
好像是tp3.2的bug,自带的redis驱动不是那么好用。。。找了方法修改优化了一下,亲测可用。
确认已经安装了redis服务器
确认php中已经安装了redis扩展
TP版本:thinkphp_3.2.3_full.zip
S缓存使用redis
复制以下内容到文本中,改名为Redis.class.php。
替换ThinkPHP\Library\Think\Cache\Driver\Redis.class.php(注意先备份)
* Redis缓存驱动
*/classRedisextendsCache{/** * 架构函数 *@paramarray $options 缓存参数 *@accesspublic */publicfunction__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参数if($this->options['auth']!=null) {$this->handler->auth($this->options['auth']); } }/** * 读取缓存 *@accesspublic *@paramstring $name 缓存变量名 *@returnmixed */publicfunctionget($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返回源数据}/** * 写入缓存 *@accesspublic *@paramstring $name 缓存变量名 *@parammixed $value 存储数据 *@paraminteger $expire 有效时间(秒) *@returnboolean */publicfunctionset($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; }/** * 删除缓存 *@accesspublic *@paramstring $name 缓存变量名 *@returnboolean */publicfunctionrm($name){return$this->handler->delete($this->options['prefix'].$name); }/** * 清除缓存 *@accesspublic *@returnboolean */publicfunctionclear(){return$this->handler->flushDB(); }}
SESSION使用redis
复制以下内容到文本中,改名为Redis.class.php。
复制到ThinkPHP\Library\Think\Session\Driver\Redis.class.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 )
* +----------------------------------------------------------------------
*/namespaceThink\Session\Driver;/**
* Redis Session驱动
*/classRedis{/**
* Redis句柄
*/private$handler;private$get_result;publicfunction__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服务端 *@accesspublic *@parambool $is_master : 是否连接主服务器 */publicfunctionconnect($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)thrownew\Think\Exception('Redis Error',100); }else{ $result =$this->handler->$func($this->options['host'][$i],$this->options['port'][$i],$this->options['timeout']);if(!$result)thrownew\Think\Exception('Redis Error',101); }if($this->options['auth'][$i]) { $result =$this->handler->auth($this->options['auth'][$i]);if(!$result) {thrownew\Think\Exception('Redis Error',102); } } }catch( \Exception$e ) {exit('Error Message:'.$e->getMessage().'
Error Code:'.$e->getCode().''); } }/** +---------------------------------------------------------- * 打开Session +---------------------------------------------------------- *@accesspublic +---------------------------------------------------------- *@paramstring $savePath *@parammixed $sessName +---------------------------------------------------------- */publicfunctionopen($savePath, $sessName){returntrue; }/** +---------------------------------------------------------- * 关闭Session +---------------------------------------------------------- *@accesspublic +---------------------------------------------------------- */publicfunctionclose(){if($this->options['persistent'] =='pconnect') {$this->handler->close(); }returntrue; }/** +---------------------------------------------------------- * 读取Session +---------------------------------------------------------- *@accesspublic +---------------------------------------------------------- *@paramstring $sessID +---------------------------------------------------------- */publicfunctionread($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 +---------------------------------------------------------- *@accesspublic +---------------------------------------------------------- *@paramstring $sessID *@paramString $sessData +---------------------------------------------------------- */publicfunctionwrite($sessID, $sessData){if(!$sessData || $sessData ==$this->get_result) {returntrue; }$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 +---------------------------------------------------------- *@accesspublic +---------------------------------------------------------- *@paramstring $sessID +---------------------------------------------------------- */publicfunctiondestroy($sessID){$this->connect(1);return$this->handler->delete($this->options['prefix'].$sessID); }/** +---------------------------------------------------------- * Session 垃圾回收 +---------------------------------------------------------- *@accesspublic +---------------------------------------------------------- *@paramstring $sessMaxLifeTime +---------------------------------------------------------- */publicfunctiongc($sessMaxLifeTime){returntrue; }/** +---------------------------------------------------------- * 打开Session +---------------------------------------------------------- *@accesspublic +---------------------------------------------------------- *@paramstring $savePath *@parammixed $sessName +---------------------------------------------------------- */publicfunctionexecute(){ session_set_save_handler(array(&$this,"open"),array(&$this,"close"),array(&$this,"read"),array(&$this,"write"),array(&$this,"destroy"),array(&$this,"gc") ); }publicfunction__destruct(){if($this->options['persistent'] =='pconnect') {$this->handler->close(); } session_write_close(); }}
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认证密码
测试
publicfunctionindex(){$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;}
使用redis管理工具查看
原文地址:http://www.jianshu.com/p/57c31e9955ff