PHP使用Redis替代文件存儲(chǔ)Session的方法
本文實(shí)例講述了PHP使用Redis替代文件存儲(chǔ)Session的方法。分享給大家供大家參考,具體如下:
PHP默認(rèn)使用文件存儲(chǔ)session,如果并發(fā)量大,效率非常低。而Redis對(duì)高并發(fā)的支持非常好,所以,可以使用redis替代文件存儲(chǔ)session。
這里,介紹下php的session_set_save_handler
函數(shù)的作用和使用方法。該函數(shù)定義用戶級(jí)session保存函數(shù)(如打開(kāi)、關(guān)閉、寫(xiě)入等)。
原型如下:
bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)
session_set_save_handler 函數(shù)各參數(shù)作用如下表
參 數(shù) | 描述 |
---|---|
open | 當(dāng)session打開(kāi)時(shí)調(diào)用此函數(shù)。接收兩個(gè)參數(shù),第一個(gè)參數(shù)是保持session的路徑,第二個(gè)參數(shù)是session的名字 |
close | 當(dāng)session操作完成時(shí)調(diào)用此函數(shù)。不接收參數(shù)。 |
read | 以session ID作為參數(shù)。通過(guò)session ID從數(shù)據(jù)存儲(chǔ)方中取得數(shù)據(jù),并返回此數(shù)據(jù)。如果數(shù)據(jù)為空,可以返回一個(gè)空字符串。此函數(shù)在調(diào)用session_start 前被觸發(fā) |
write | 當(dāng)數(shù)據(jù)存儲(chǔ)時(shí)調(diào)用。有兩個(gè)參數(shù),一個(gè)是session ID,另外一個(gè)是session的數(shù)據(jù) |
destroy | 當(dāng)調(diào)用session_destroy 函數(shù)時(shí)觸發(fā)destroy函數(shù)。只有一個(gè)參數(shù) session ID |
gc | 當(dāng)php執(zhí)行session垃圾回收機(jī)制時(shí)觸發(fā) |
在使用該函數(shù)前,先把php.ini配置文件的session.save_handler選項(xiàng)設(shè)置為user,否則session_set_save_handle 不會(huì)生效。
編寫(xiě)一個(gè)session管理類sessionManager.php ,代碼如下:
<?php class SessionManager{ private $redis; private $sessionSavePath; private $sessionName; private $sessionExpireTime=30;//redis,session的過(guò)期時(shí)間為30s public function __construct(){ $this->redis = new Redis();//創(chuàng)建phpredis實(shí)例 $this->redis->connect('127.0.0.1',6379);//連接redis $this->redis->auth("107lab");//授權(quán) $retval = session_set_save_handler( array($this,"open"), array($this,"close"), array($this,"read"), array($this,"write"), array($this,"destroy"), array($this,"gc") ); session_start(); } public function open($path,$name){ return true; } public function close(){ return true; } public function read($id){ $value = $this->redis->get($id);//獲取redis中的指定記錄 if($value){ return $value; }else{ return ''; } } public function write($id,$data){ if($this->redis->set($id,$data)){//以session ID為鍵,存儲(chǔ) $this->redis->expire($id,$this->sessionExpireTime);//設(shè)置redis中數(shù)據(jù)的過(guò)期時(shí)間,即session的過(guò)期時(shí)間 return true; } return false; } public function destroy($id){ if($this->redis->delete($id)){//刪除redis中的指定記錄 return true; } return false; } public function gc($maxlifetime){ return true; } public function __destruct(){ session_write_close(); } }
SessionManager構(gòu)造函數(shù)主要用來(lái)連接Redis服務(wù)器,使用session_set_save_handler函數(shù)設(shè)置session回調(diào)函數(shù),并調(diào)用session_start函數(shù)開(kāi)啟session功能。因?yàn)楸纠衞pen、close和gc回調(diào)函數(shù)的作用不是很大,所以直接返回true。
在write回調(diào)函數(shù)中,以session ID 作為key,把session的數(shù)據(jù)作為value存儲(chǔ)到redis服務(wù)器,設(shè)置session的過(guò)期時(shí)間為30秒。在read 回調(diào)函中,以session ID 作為key從redis服務(wù)器中讀取數(shù)據(jù),并返回此數(shù)據(jù)。而在destroy回調(diào)函數(shù)重,則以session ID 作為key 從redis服務(wù)器中刪除對(duì)應(yīng)的session數(shù)據(jù)。
使用時(shí),只需包含SessionManager類,然后實(shí)例化一個(gè)SessionManager對(duì)象。下面建立個(gè)session_set.php文件。輸入代碼
<?php include('SessionManager.php'); new SessionManager(); $_SESSION['username'] = 'captain';
然后再創(chuàng)建一個(gè)session_get.php文件,輸入如下代碼:
<?php include('SessionManager.php'); new SessionManager(); echo $_SESSION['username'];
測(cè)試時(shí),首先訪問(wèn)session_set.php,然后再訪問(wèn) session_get.php,輸出結(jié)果如下所示:
再查看redis數(shù)據(jù)庫(kù),如下所示
127.0.0.1:6379> keys * 1) "oe94eic337slnjv1bvlreoa574" 127.0.0.1:6379> get oe94eic337slnjv1bvlreoa574 "username|s:7:\"captain\";"
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php+redis數(shù)據(jù)庫(kù)程序設(shè)計(jì)技巧總結(jié)》、《PHP擴(kuò)展開(kāi)發(fā)教程》、《php+mysql數(shù)據(jù)庫(kù)操作入門(mén)教程》、《php+mysqli數(shù)據(jù)庫(kù)程序設(shè)計(jì)技巧總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)教程》、《PHP網(wǎng)絡(luò)編程技巧總結(jié)》及《php常見(jiàn)數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
談PHP生成靜態(tài)頁(yè)面分析 模板+緩存+寫(xiě)文件
談PHP生成靜態(tài)頁(yè)面 模板+緩存+寫(xiě)文件,大家可以參考下代碼。2009-08-08php數(shù)組函數(shù)序列之a(chǎn)rray_flip() 將數(shù)組鍵名與值對(duì)調(diào)
array_flip() 函數(shù)將使數(shù)組的鍵名與其相應(yīng)值調(diào)換,即鍵名變成了值,而值變成了鍵名2011-11-11php中g(shù)et_object_vars()方法用法實(shí)例
這篇文章主要介紹了php中g(shù)et_object_vars()方法用法,實(shí)例分析了get_object_vars()方法獲取對(duì)象中屬性的使用技巧,需要的朋友可以參考下2015-02-02php將從數(shù)據(jù)庫(kù)中獲得的數(shù)據(jù)轉(zhuǎn)換成json格式并輸出的方法
今天小編就為大家分享一篇php將從數(shù)據(jù)庫(kù)中獲得的數(shù)據(jù)轉(zhuǎn)換成json格式并輸出的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08PHP高級(jí)對(duì)象構(gòu)建 工廠模式的使用
工廠模式包含普通工廠模式和抽象工廠模式,但是,不管是什么工廠模式,它們都是有一個(gè)作用,那就是生成對(duì)象2012-02-02PHP extract 將數(shù)組拆分成多個(gè)變量的函數(shù)
extract()函數(shù)提取關(guān)聯(lián)數(shù)組(對(duì)數(shù)字索引數(shù)組無(wú)效)每對(duì)key和value,生成以key為變量名、value為對(duì)應(yīng)值的多組新變量。2010-06-06PHP 之 寫(xiě)時(shí)復(fù)制介紹(Copy On Write)
很多時(shí)候,我們會(huì)因?yàn)橐恍┬g(shù)語(yǔ)而對(duì)其概念產(chǎn)生莫測(cè)高深的恐懼,而其實(shí),他們的基本原理往往非常簡(jiǎn)單。本小節(jié)將介紹PHP中寫(xiě)時(shí)復(fù)制這種策略的實(shí)現(xiàn)2014-05-05