使用session_set_save_handler()函數,將Session的內容寫入數據庫
1 <?php 2 /* 3 *@author Fahy 4 *@link http://home.cnblogs.com/u/HuangWj 5 *數據庫為mysql, 6 *數據庫名為session,表名為session, 7 *表中字段包括PHPSESSID,update_time,client_ip,data 8 */ 9 class Session{ 10 private static $handler = null; 11 private static $ip = null; 12 private static $lifetime = null; 13 private static $time = null; 14 15 //配置靜態變量 16 private static function init($handler){ 17 self::$handler = $handler; //獲取數據庫資源 18 self::$ip = !empty($_SERVER["REMOTE_ADDR"])? $_SERVER["REMOTE_ADDR"]:'unkonw'; //獲取客戶端ip 19 self::$lifetime = ini_get('session.gc_maxlifetime'); //獲取session生命周期 20 self::$time = time(); //獲取當前時間 21 } 22 //調用session_set_save_handler()函數並開啟session 23 static function start($pdo){ 24 self::init($pdo); 25 session_set_save_handler( 26 array(__CLASS__,'open'), 27 array(__CLASS__,'close'), 28 array(__CLASS__,'read'), 29 array(__CLASS__,'write'), 30 array(__CLASS__,'destroy'), 31 array(__CLASS__,'gc') 32 ); 33 session_start(); 34 } 35 36 public static function open($path,$name){ 37 return true; 38 } 39 public static function close(){ 40 return true; 41 } 42 43 //查詢數據庫中的數據 44 public static function read($PHPSESSID){ 45 $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?"; 46 $stmt = self::$handler->prepare($sql); 47 $stmt->execute(array($PHPSESSID)); 48 if(!$result = $stmt->fetch(PDO::FETCH_ASSOC)){ 49 return ''; 50 } 51 if(self::$ip == $result['client_ip']){ 52 self::destroy($PHPSESSID); 53 return ''; 54 } 55 if(($result['update_time']+self::$lifetime)<self::$time){ 56 self::destroy($PHPSESSID); 57 return ''; 58 } 59 return $result['data']; 60 } 61 /* 62 *首先查詢該session是否存在數據,如果存在,則更新數據,如果不存在,則插入數據 63 */ 64 //將session寫入數據庫中,$data傳入session中的keys和values數組 65 public static function write($PHPSESSID,$data){ 66 $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?"; 67 $stmt = self::$handler->prepare($sql); 68 $stmt->execute(array($PHPSESSID)); 69 70 if($result=$stmt->fetch(PDO::FETCH_ASSOC)){ 71 if($result['data'] != $data || self::$time > ($result['update_time']+30)){ 72 $sql = "update session set update_time=?,data=? where PHPSESSID = ?"; 73 $stmt = self::$handler->prepare($sql); 74 $stmt->execute(array($self::$time,$data,$PHPSESSID)); 75 } 76 }else{ 77 if(!empty($data)){ 78 try{ 79 $sql = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)"; 80 }catch(PDOException $e){ 81 echo $e->getMessage(); 82 } 83 $sth = self::$handler->prepare($sql); 84 $sth->execute(array($PHPSESSID,self::$time,self::$ip,$data)); 85 } 86 } 87 return true; 88 } 89 90 public static function destroy($PHPSESSID){ 91 $sql = "delete from session where PHPSESSID = ?"; 92 $stmt = self::$handler->prepare($sql); 93 $stmt->execute(array($PHPSESSID)); 94 return true; 95 } 96 public static function gc($lifetime){ 97 $sql = "delete from session where update_time<?"; 98 $stmt = self::$handler->prepare($sql); 99 $stmt->execute(array(self::$time-$lifetime)); 100 return true; 101 } 102 } 103 //使用PDO連接數據庫 104 try{ 105 $pdo = new PDO("mysql:host=localhost;dbname=session","root","hwj193"); 106 }catch(PDOException $e){ 107 echo $e->getMessage(); 108 } 109 //傳遞數據庫資源 110 Session::start($pdo);