前面也講到了用memcache存儲數據信息緩存的方法和好處,這樣能夠減少訪問數據庫的次數,減少訪問量大時對數據庫的壓力
將session存儲到memcache中管理需要了解memcache、session的使用和session_set_save_handler()
同樣先編寫一個公用的類,當然采用靜態的成員方法
memcache 指令用telnet操作
同樣現在根目錄下建立需要用到的文件
其中memsession.class.php 是公用的memcache存儲類文件,one.php、two.php和three.php是測試文件,items.php 是輸出數據數組的
session.class.php中:
首先定義連接memcache用到的變量並初始化
connect("localhost",11211) or die("could not connect"); MemSession::start($memcache);
注意的是 NS 為常量,定義下標
再初始化方法
//初始化方法 private static function init($handler){ self::$handler=$handler; self::$lifetime=ini_get('session.gc_maxlifetime'); self::$time=time(); }
開啟session,並定義調用本類中的open、close等方法
//開啟session public static function start(Memcache $memcache){ //首先將屬性初始化 self::init($memcache); //調用handler,以後調用handler時都是用memcache session_set_save_handler( array(__CLASS__,'open'),//調用本類的open方法 array(__CLASS__,'close'), array(__CLASS__,'read'), array(__CLASS__,'write'), array(__CLASS__,'destroy'), array(__CLASS__,'gc') ); //調用session_start() session_start(); }
open() 和 close() 只要返回真就可以,但 open() 的參數為 路徑(path) 和 名稱(name)
public static function open($path, $name){ return true; } public static function close(){ return true; }
但要判斷傳入的out 參數是否有值,有值就返回out的數據
public static function read($PHPSESSID){ $out=self::$handler->get(self::session_key($PHPSESSID)); //得到該下標輸出的數據 if($out===false || $out ==null){ return ''; //out得到數據沒有,返回空 } return $out; //返回得到的數據 }
返回自身的id,數據,和生命時長
public static function write($PHPSESSID, $data){ //判斷是否有數據 $method=$data ? 'set' : 'relpace'; return self::$handler->$method(self::session_key($PHPSESSID), $data, MEMCACHE_COMPRESSED, self::$lifetime); }
destroy() 和 gc() :
destroy()調用自身的delete方法
public static function destroy($PHPSESSID){ return self::$handler->delete(self::session_key($PHPSESSID)); //調用delete方法 } public static function gc($lifetime){ return true; }
private static function session_key($PHPSESSID){ $session_key=self::NS.$PHPSESSID; //鍵值為自身和傳進來的phpsessid return $session_key; }
結果顯示
如果成功,在telnet中顯示
表示session數據信息儲存到memcache成功