zoukankan      html  css  js  c++  java
  • 数据库处理session类

    <?php 
        /*
        *    使用数据库处理session
        *    php.ini 中 session.save_handler 设为 "user"
        */
        class Dbsession{
            private static $ua;   //代理浏览器
            private static $ip;        //IP地址
            private static $lifetime;//session生存时间
            private static $time;     //当前时间
            private static $pdo;
            
            public static function start(PDO $pdo){
                self::$pdo = $pdo;
                self::$ua = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
                
                if ( !empty( $_SERVER['HTTP_CLIENT_IP'] ) ) { //check ip from share internet
                    self::$ip = $_SERVER['HTTP_CLIENT_IP'];
                } else if ( !empty( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
                    self::$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
                } else {
                    self::$ip = $_SERVER['REMOTE_ADDR'];
                }
                filter_var(self::$ip,FILTER_VALIDATE_IP) === FALSE && self::$ip = 'unknown';
                self::$lifetime = ini_get("session.gc_maxlifetime");
                self::$time = time();
                
                session_set_save_handler(
                    array(__CLASS__,'open'),
                    array(__CLASS__,'close'),
                    array(__CLASS__,'read'),
                    array(__CLASS__,'write'),
                    array(__CLASS__,'destroy'),
                    array(__CLASS__,'gc')
                );
                
                session_start();
            }
            
            private static function open($path,$name){
                return true;
            }
            
            public static function close(){
                return true;
            }
            
            private static function read($sid){
                $sql = "select * from session where sid=?";
                $st = self::$pdo->prepare($sql);
                $st->execute(array($sid));
                //没有数据
                if(!$result = $st->fetch(PDO::FETCH_ASSOC)){
                    return '';
                }
                //用户更换了浏览器或者IP地址
                if($result['ua'] != self::$ua || $result['ip'] != self::$ip){
                    self::destroy($sid);
                    return '';
                }
                //时间过期
                if($result['updatetime']+self::$lifetime < self::$time){
                    self::destroy($sid);
                    return '';
                }
                
                return $result['data']; //返回session数据
                
            }
            
            public static function write($sid,$data){
                //先查有无session
                $sql = "select * from session where sid=?";
                $st = self::$pdo->prepare($sql);
                $st->execute(array($sid));
                if($result = $st->fetch(PDO::FETCH_ASSOC)){
                    //数据发生改变或者30秒开外,则更新
                    if($result['data'] != $data || $result['updatetime']+30 < self::$time){
                        $sql = "update session set data=? ,updatetime=? where sid=?";
                        $st = self::$pdo->prepare($sql);
                        $st->execute(array($data,self::$time,$sid));
                    }
                }else{
                    if(!empty($data)){
                        $sql = "insert into session values(?,?,?,?,?)";
                        $st = self::$pdo->prepare($sql);
                        $st->execute(array($sid,$data,self::$time,self::$ua,self::$ip));
                    }                
                }
                return true;
            }
            
            public static function destroy($sid){
                $sql = "delete from session where sid=?";
                $st = self::$pdo->prepare($sql);
                $st->execute(array($sid));
                return true;
            }
            
            private static function gc($lifetime){
                $sql = "delete from session where updatetime<?";
                $st = self::$pdo->prepare($sql);
                $st->execute(array(self::$time-$lifetime));
                return true;
            }
        }
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
  • 相关阅读:
    精彩回顾 | Serverless Developer Meetup 12.04 深圳站
    Dubbo3 Triple 协议简介与选型思考
    阿里云 FaaS 架构设计与创新实践
    KubeDL 0.4.0 Kubernetes AI 模型版本管理与追踪
    shell脚本awk的用法
    case用法ping命令脚本(工作中常用的)
    linux时间与internet时间同步
    bootStrap表单验证插件的使用
    状态模式之观察者模式
    20211125
  • 原文地址:https://www.cnblogs.com/hejun695/p/5332922.html
Copyright © 2011-2022 走看看