php教程

超轻量级php框架startmvc

php实现将Session写入数据库

更新时间:2020-03-05 06:33 作者:startmvc
使用session_set_save_handler()函数,将Session的内容写入数据库<?php/**@authorFahy*数据库为mysql

使用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);

以上所述就是本文的全部内容了,希望大家能够喜欢。