這篇文章主要介紹了php實現將Session寫入數據庫的相關資料,需要的朋友可以參考下
使用session_set_save_handler()函數,將Session的內容寫入數據庫
- <?php
- /*
- *@author Fahy
- *數據庫為mysql,
- *數據庫名為session,表名為session,
- *表中字段包括PHPSESSID,update_time,client_ip,data
- */
- class Session{
- private static $handler = null;
- private static $ip = null;
- private static $lifetime = null;
- private static $time = null;
- //配置靜態變量
- private static function init($handler){
- self::$handler = $handler; //獲取數據庫資源
- self::$ip = !empty($_SERVER["REMOTE_ADDR"])? $_SERVER["REMOTE_ADDR"]:'unkonw'; //獲取客戶端ip
- self::$lifetime = ini_get('session.gc_maxlifetime'); //獲取session生命周期
- self::$time = time(); //獲取當前時間
- }
- //調用session_set_save_handler()函數并開啟session
- static function start($pdo){
- self::init($pdo);
- session_set_save_handler(
- array(__CLASS__,'open'),
- array(__CLASS__,'close'),
- array(__CLASS__,'read'),
- array(__CLASS__,'write'),
- array(__CLASS__,'destroy'),
- array(__CLASS__,'gc')
- );
- session_start();
- }
- public static function open($path,$name){
- return true;
- }
- public static function close(){
- return true;
- }
- //查詢數據庫中的數據
- public static function read($PHPSESSID){
- $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?";
- $stmt = self::$handler->prepare($sql);
- $stmt->execute(array($PHPSESSID));
- if(!$result = $stmt->fetch(PDO::FETCH_ASSOC)){
- return '';
- }
- if(self::$ip == $result['client_ip']){
- self::destroy($PHPSESSID);
- return '';
- }
- if(($result['update_time']+self::$lifetime)<self::$time){
- self::destroy($PHPSESSID);
- return '';
- }
- return $result['data'];
- }
- /*
- *首先查詢該session是否存在數據,如果存在,則更新數據,如果不存在,則插入數據
- */
- //將session寫入數據庫中,$data傳入session中的keys和values數組
- public static function write($PHPSESSID,$data){
- $sql = "select PHPSESSID,update_time,client_ip,data from session where PHPSESSID=?";
- $stmt = self::$handler->prepare($sql);
- $stmt->execute(array($PHPSESSID));
- if($result=$stmt->fetch(PDO::FETCH_ASSOC)){
- if($result['data'] != $data || self::$time > ($result['update_time']+30)){
- $sql = "update session set update_time=?,data=? where PHPSESSID = ?";
- $stmt = self::$handler->prepare($sql);
- $stmt->execute(array($self::$time,$data,$PHPSESSID));
- }
- }else{
- if(!empty($data)){
- try{
- $sql = "insert into session(PHPSESSID,update_time,client_ip,data) values(?,?,?,?)";
- }catch(PDOException $e){
- echo $e->getMessage();
- }
- $sth = self::$handler->prepare($sql);
- $sth->execute(array($PHPSESSID,self::$time,self::$ip,$data));
- }
- }
- return true;
- }
- public static function destroy($PHPSESSID){
- $sql = "delete from session where PHPSESSID = ?";
- $stmt = self::$handler->prepare($sql);
- $stmt->execute(array($PHPSESSID));
- return true;
- }
- public static function gc($lifetime){
- $sql = "delete from session where update_time<?";
- $stmt = self::$handler->prepare($sql);
- $stmt->execute(array(self::$time-$lifetime));
- return true;
- }
- }
- //使用PDO連接數據庫
- try{
- $pdo = new PDO("mysql:host=localhost;dbname=session","root","hwj193");
- }catch(PDOException $e){
- echo $e->getMessage();
- }
- //傳遞數據庫資源
- Session::start($pdo);
以上所述就是本文的全部內容了,希望大家能夠喜歡。
新聞熱點
疑難解答