Thinkphp 3.2.3 redis緩存

轉(zhuǎn)載?00天火00?文章保存一下先。惭墓。

說明

好像是tp3.2的bug,自帶的redis驅(qū)動(dòng)不是那么好用坛梁。。腊凶。找了方法修改優(yōu)化了一下划咐,親測(cè)可用。

確認(rèn)已經(jīng)安裝了redis服務(wù)器

確認(rèn)php中已經(jīng)安裝了redis擴(kuò)展

TP版本:thinkphp_3.2.3_full.zip

S緩存使用redis

復(fù)制以下內(nèi)容到文本中钧萍,改名為Redis.class.php褐缠。

替換ThinkPHP\Library\Think\Cache\Driver\Redis.class.php(注意先備份)


* Redis緩存驅(qū)動(dòng)

*/classRedisextendsCache{/**? ? * 架構(gòu)函數(shù)? ? *@paramarray $options 緩存參數(shù)? ? *@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認(rèn)證'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']);? ? ? ? }? ? }/**? ? * 讀取緩存? ? *@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;//檢測(cè)是否為JSON數(shù)據(jù) true 返回JSON解析數(shù)組, false返回源數(shù)據(jù)}/**? ? * 寫入緩存? ? *@accesspublic? ? *@paramstring $name 緩存變量名? ? *@parammixed $value? 存儲(chǔ)數(shù)據(jù)? ? *@paraminteger $expire? 有效時(shí)間(秒)? ? *@returnboolean? ? */publicfunctionset($name, $value, $expire = null){? ? ? ? N('cache_write',1);if(is_null($expire)) {? ? ? ? ? ? $expire? =$this->options['expire'];? ? ? ? }? ? ? ? $name? =$this->options['prefix'].$name;//對(duì)數(shù)組/對(duì)象數(shù)據(jù)進(jìn)行緩存處理,保證數(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) {// 記錄緩存隊(duì)列$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

復(fù)制以下內(nèi)容到文本中划煮,改名為Redis.class.php送丰。

復(fù)制到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驅(qū)動(dòng)

*/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服務(wù)端? ? *@accesspublic? ? *@parambool $is_master : 是否連接主服務(wù)器? ? */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);//多個(gè)從服務(wù)器隨機(jī)選擇}? ? ? ? }? ? ? ? $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;? ? }/**? ? ? +----------------------------------------------------------? ? * 關(guān)閉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);//延長(zhǎng)有效期$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 驅(qū)動(dòng)'SESSION_PREFIX'=>'sess_',//session前綴'SESSION_EXPIRE'=>'7200',//session有效期(單位:秒) 0表示永久緩存缔俄,當(dāng)session被訪問時(shí)弛秋,時(shí)間重新計(jì)算器躏。//緩存 配置'DATA_CACHE_TYPE'=>'Redis',//默認(rèn)動(dòng)態(tài)緩存為Redis'DATA_CACHE_PREFIX'=>'Redis_',//緩存前綴'DATA_CACHE_TIME'=>'0',//緩存時(shí)間 0為永久 當(dāng)緩存被訪問時(shí),時(shí)間不重新計(jì)算//Redis 配置'REDIS_RW_SEPARATE'=>true,//Redis讀寫分離 true 開啟'REDIS_HOST'=>'127.0.0.1',//redis服務(wù)器ip蟹略,多臺(tái)用逗號(hào)隔開登失;讀寫分離開啟時(shí),第一臺(tái)負(fù)責(zé)寫挖炬,其它[隨機(jī)]負(fù)責(zé)讀揽浙;'REDIS_PORT'=>'6379',//端口號(hào)'REDIS_TIMEOUT'=>'30',//超時(shí)時(shí)間(秒)'REDIS_PERSISTENT'=>false,//是否長(zhǎng)連接 false=短連接'REDIS_AUTH'=>'123456',//AUTH認(rèn)證密碼

測(cè)試

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.reibang.com/p/57c31e9955ff

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市意敛,隨后出現(xiàn)的幾起案子馅巷,更是在濱河造成了極大的恐慌,老刑警劉巖草姻,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钓猬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撩独,警方通過查閱死者的電腦和手機(jī)敞曹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來综膀,“玉大人澳迫,你說我怎么就攤上這事【缛埃” “怎么了橄登?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)讥此。 經(jīng)常有香客問我示绊,道長(zhǎng),這世上最難降的妖魔是什么暂论? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任面褐,我火速辦了婚禮,結(jié)果婚禮上取胎,老公的妹妹穿的比我還像新娘展哭。我一直安慰自己,他們只是感情好闻蛀,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布匪傍。 她就那樣靜靜地躺著,像睡著了一般觉痛。 火紅的嫁衣襯著肌膚如雪役衡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天薪棒,我揣著相機(jī)與錄音手蝎,去河邊找鬼榕莺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棵介,可吹牛的內(nèi)容都是我干的钉鸯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼邮辽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼唠雕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吨述,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤岩睁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后揣云,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笙僚,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年灵再,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肋层。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翎迁,死狀恐怖栋猖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汪榔,我是刑警寧澤蒲拉,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站痴腌,受9級(jí)特大地震影響雌团,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜士聪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一锦援、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧剥悟,春花似錦灵寺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至慈缔,卻和暖如春叮称,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工瓤檐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赂韵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓距帅,卻偏偏與公主長(zhǎng)得像右锨,于是被迫代替她去往敵國(guó)和親括堤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子碌秸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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