<?php
//用户自定义session类,使用数据库数据表的方式来存储session信息
class DBSession{
private static $pdo; //全局的pdo对象
private static $utime; //当前时间
private static $maxlifetime; //文件最大存在时间
private static $sip; //用户的ip地址
private static $uagent; //用户使用的浏览器
//自定义用户开启session的方式
public static function start(PDO $pdo){
self::$pdo=$pdo;
self::$utime=time();
self::$maxlifetime=ini_get(‘session.gc_maxlifetime’);
self::$sip=’192.168.1.100′;
self::$uagent=’IE’;
//将用户自定义session生命周期的方法注册到web服务器中
session_set_save_handler(
array(__CLASS__,’open’),
array(__CLASS__,’close’),
array(__CLASS__,’read’),
array(__CLASS__,’write’),
array(__CLASS__,’destroy’),
array(__CLASS__,’gc’)
);
session_start();
}
//用户自定义session生命周期的方法如下:
public static function open($path,$name){
return true;
}
public static function read($sid){
$sql=”select * from session where sid=?”;
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array($sid));
$result=$stmt->fetch(PDO::FETCH_ASSOC);
//如果查询结果为空,则返回空字符串;
if(!$result){
return ”;
}
//如果查询结果为过期,则删除此条session结果
if($result[‘utime’]<self::$utime-self::$maxlifetime){
self::destroy($sid);
return ”;
}
//如果用户换了ip或换了浏览器
if($result[‘sip’] != self::$sip || $result[‘uagent’] != self::$uagent) {
self::destroy($sid);
return ”;
}
}
public static function write($sid,$data){
//查询数据表中是否已经存在同样id名的数据
$sql=’select * from session where sid=?’;
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array($sid));
$result=$stmt->fetch(PDO::FETCH_ASSOC);
if($result){
//如果查询出来的数据和之前一样没更改则不执行以下操作,或者在指定时间10秒之后更新
if(($result[‘sdata’]!=$data)||($result[‘utime’]+10<self::$utime)){
//如果查询有同样的结果,则更新session表而不重新插入session内容
$sql=”update session set utime=?,sdata=? where sid=? “;
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array(self::$utime,$data,$sid));
}
}else{
//插入数据到已经创建好的session数据表中
//如果用户有更新session内容
if(!empty($data)){
$sql=”insert into session(sid,utime,sdata,sip,uagent)values(?,?,?,?,?)”;
$stmt=self::$pdo->prepare($sql);
$stmt->execute(array($sid,self::$utime,$data,self::$sip,self::$uagent));
}
}
}
public static function destroy($sid){
$sql=’delete from session where sid=?’;
$stmt=self::$pdo->prepare($sql);
return $stmt->execute(array($sid));
}
public static function close(){
return true;
}
public static function gc($maxlifetime){
//如果文件已经过期则删除该条session记录
$sql=’delete from session where utime<?’;
$stmt=self::$pdo->prepare($sql);
return $stmt->execute(array(self::$utime-self::$maxlifetime));
}
}
//start方法参数中传入一个已经连接上数据库的PDO对象
DBSession::start($pdo);
?>
原文链接:https://blog.csdn.net/living_ren/article/details/78527513
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
评论前必须登录!
立即登录