session 加入redis的實(shí)現(xiàn)代碼
Session信息入redis
Session簡(jiǎn)介
session,中文經(jīng)常翻譯為會(huì)話,其本來(lái)的含義是 指有始有終的一系列動(dòng)作/消息,比如打電話時(shí)從拿起電話撥號(hào)到掛斷電話這中間的一系列過(guò)程可以稱之為一個(gè)session。有時(shí)候我們可以看到這樣的話“在 一個(gè)瀏覽器會(huì)話期間,...”,這里的會(huì)話一詞用的就是其本義,是指從一個(gè)瀏覽器窗口打開(kāi)到關(guān)閉這個(gè)期間①。最混亂的是“用戶(客戶端)在一次會(huì)話期間”這樣一句話,它可能指用戶的一系列動(dòng)作(般情況下是同某個(gè)具體目的相關(guān)的一系列動(dòng)作,比如從登錄到選購(gòu)商品到結(jié)賬登出這樣一個(gè)網(wǎng)上購(gòu)物的過(guò)程,有時(shí)候也被稱為一個(gè)transaction),然而有時(shí)候也可能僅僅是指一次連接,也有可能是指含義①,其中的差別只能靠上下文來(lái)推斷②。
在本文中,使用中文“瀏覽器會(huì)話期間”來(lái)表達(dá)含義①,使用“session機(jī)制”來(lái)表達(dá)含義④,使用“session”表達(dá)含義⑤,使用具體的“HttpSession”來(lái)表達(dá)含義⑥
為什么要把SESSION保存在緩存
就php來(lái)說(shuō),語(yǔ)言本身支持的session是以文件的方式保存到磁盤(pán)文件中,保存在指定的文件夾中,保存的路徑可以在配置文件中設(shè)置或者在程序中使用函數(shù)session_save_path()進(jìn)行設(shè)置,但是這么做有弊端,
第一就是保存到文件系統(tǒng)中,效率低,只要有用到session就會(huì)從好多個(gè)文件中查找指定的sessionid,效率很低。
第二就是當(dāng)用到多臺(tái)服務(wù)器的時(shí)候可能會(huì)出現(xiàn),session丟失問(wèn)題(其實(shí)是保存在了其他服務(wù)器上)。
當(dāng)然了,保存在緩存中可以解決上面的問(wèn)題,如果使用php本身的session函數(shù),可以使用 session_set_save_handler()函數(shù)很方便的對(duì)session的處理過(guò)程進(jìn)行重新控制。如果不用php的session系列函數(shù), 可以自己編寫(xiě)個(gè)類似的session函數(shù),也是可以的,我現(xiàn)在做的這個(gè)項(xiàng)目就是這樣,會(huì)根據(jù)用戶的mid、登錄時(shí)間進(jìn)行求hash作為 sessionId,每次請(qǐng)求的時(shí)候都必須加上sessionId才算合法(第一次登錄的時(shí)候是不需要的,這個(gè)時(shí)候會(huì)創(chuàng)建sessionId,返回給客戶 端),這么做也很方便、簡(jiǎn)潔高效的。當(dāng)然了,我這篇文章主要說(shuō)的是在php自身的SESSION中”做做手腳”。
SESSION保存在緩存中
php將緩存保存到redis中,可以使用配置文件,對(duì)session的處理和保存做修改,當(dāng)然了,在程序中使用ini_set()函數(shù)去修改也可以,這個(gè)很方便測(cè)試,我這里就使用這種方式,當(dāng)然了,要是生產(chǎn)環(huán)境還是建議使用配置文件。
如果想簡(jiǎn)單操作session入redis操作可以將一下代碼運(yùn)行一下
<?php ini_set("session.save_handler", "redis"); ini_set("session.save_path", "tcp://localhost:6379"); session_start(); header("Content-type:text/html;charset=utf-8"); if(isset($_SESSION['view'])){ $_SESSION['view'] = $_SESSION['view'] + 1; }else{ $_SESSION['view'] = 1; } echo "【view】{$_SESSION['view']}"; //這里設(shè)置session.save_handler方式為redis,session.save_path為redis的地址和端口,設(shè)置之后刷新,再回頭查看redis,會(huì)發(fā)現(xiàn)redis中的生成了sessionId,sessionId和瀏覽器請(qǐng)求的是一樣的, //也可以使用 Session_set_save_handler(‘open','close',' read',' write',' destory',' gc'); //用法如下自定義一個(gè)Redis_session類 <?php class RedisSession{ private $_redis = array( 'handler' => null, //數(shù)據(jù)庫(kù)連接句柄 'host' => null, //redis端口號(hào) 'port' => null, ); public function __construct($array = array()){ isset($array['host'])?$array['host']:"false"; isset($array['port'])?$array['host']:"false"; $this->_redis = array_merge($this->_redis, $array); } public function begin(){ //設(shè)置session處理函數(shù) session_set_save_handler( array($this, 'open'), array($this, 'close'), array($this, 'read'), array($this, 'write'), array($this, 'destory'), array($this, 'gc') ); } public function open(){ $redis = new Redis(); $redis->connect($this->_redis['host'], $this->_redis['port']); if(!$redis){ return false; } $this->_redis['handler'] = $redis; $this->gc(null); return true; } //關(guān) public function close(){ return $this->_redis['handler']->close(); } //讀 public function read($session_id){ return $this->_redis['handler']->get($session_id); } //寫(xiě) public function write($sessionId, $sessionData){ return $this->_redis['handler']->set($sessionId, $sessionData); } public function destory($sessionId){ return $this->_redis['handler']->delete($sessionId) >= 1 ? true : false; } public function gc(){ //獲取所有sessionid,讓過(guò)期的釋放掉 $this->_redis['handler']->keys("*"); return true; } } $ses = new RedisSession(array('host'=>'127.0.0.1','port'=>'6379')); $ses->begin(); session_start(); $_SESSION['name']='zhangsan'; echo $_SESSION['name'];
這樣就可以實(shí)現(xiàn)session數(shù)據(jù)如redis代碼執(zhí)行過(guò)程中必須安裝redis才可以。
相關(guān)文章
PHP獲取當(dāng)前時(shí)間的5種實(shí)現(xiàn)方式
這篇文章主要介紹了PHP獲取當(dāng)前時(shí)間的5種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01PHP實(shí)現(xiàn)財(cái)務(wù)審核通過(guò)后返現(xiàn)金額到客戶的功能
有這么一個(gè)返現(xiàn)的系統(tǒng),當(dāng)前端客戶發(fā)起提現(xiàn)的時(shí)候,后端就要通過(guò)審核這筆返現(xiàn)訂單,才可以返現(xiàn)到客戶的賬號(hào)里。這篇文章主要介紹了PHP實(shí)現(xiàn)財(cái)務(wù)審核通過(guò)后返現(xiàn)金額到客戶 ,需要的朋友可以參考下2019-07-07TP5框架實(shí)現(xiàn)的數(shù)據(jù)庫(kù)備份功能示例
這篇文章主要介紹了TP5框架實(shí)現(xiàn)的數(shù)據(jù)庫(kù)備份功能,結(jié)合實(shí)例形式分析了TP5數(shù)據(jù)庫(kù)備份功能相關(guān)原理及實(shí)現(xiàn)方法,需要的朋友可以參考下2020-04-04thinkPHP簡(jiǎn)單導(dǎo)入和使用阿里云OSSsdk的方法
這篇文章主要介紹了thinkPHP簡(jiǎn)單導(dǎo)入和使用阿里云OSSsdk的方法,簡(jiǎn)單說(shuō)明了阿里云OSS的php sdk下載地址及thinkPHP導(dǎo)入與使用OSSsdk的方法,需要的朋友可以參考下2017-03-03