纵有疾风起
人生不言弃

使用数据库的方式来自定义存储用户session信息

<?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

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

未经允许不得转载:起风网 » 使用数据库的方式来自定义存储用户session信息
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录