返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP 自定义session储存 数据库 方式类 高洛峰 细说PHP
  • 466
分享到

PHP 自定义session储存 数据库 方式类 高洛峰 细说PHP

2024-04-02 19:04:59 466人浏览 八月长安
摘要

自定义session储存 数据库 方式类在PHP.ini配置文件中更改设置 (ReGIStered_save_handlers 有三种方式 files user memcache)session.save_

自定义session储存 数据库 方式类

PHP.ini配置文件中更改设置 (ReGIStered_save_handlers 有三种方式 files user memcache)

session.save_handler = user 表示用户自定义session类

<?php 

 class DBSession{    
      public  static  $pdo;                     //pdo的对象
      public  static $ctime;                   //当前时间 
      public  static $maxlifetime;         //最大生存时间
      public  static $uip;                      //用户正在用的ip
      public  static $uagent;               //用户正在使用的浏览器
      
      public static function start(PDO $pdo){//限制变量是PDO类
            self::$pdo               =   $pdo;
            self::$ctime            =   time();
            self::$maxlifetime =    ini_get('session.GC_maxlifetime'); 
           //设置不同版本的浏览器获取ip方式
            self::$uip                =  !empty($_SERVER['Http_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : 
            (!empty($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR']:
            (!empty($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:" "));         
            self::$uagent         =   !empty($_SERVER['HTTP_USER_AGENT'])?$_SERVER['HTTP_USER_AGENT']:' ';
            //判断ip是否合法
           // filter_var(self::$uip,FILTER_VALIDATE_IP)  && self::$uip = ' ';
            
          //注册自定义函数
          session_set_save_handler(
              array(__CLASS__,'open'), 
               array(__CLASS__,'close'),
               array(__CLASS__,'read'),
               array(__CLASS__,'write'),
               array(__CLASS__,'destroy'),
               array(__CLASS__, 'gc'));
          //开启会话
          session_start();
      }
      
        //开始 sesssion_start()
        public static function  open($path,$name){
            echo 'open<br/>';
            return true;
        }
        //关闭
        public static function close(){
            echo 'close<br/>';
           return true;
        }
        //读取 echo 
        public static function read($sid){
            echo 'read<br/>';   
            $query = "select * from session where sid = ?";
            $stmt   = self::$pdo->prepare($query);
            $stmt->execute(array($sid));
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            //还没有会话信息,返回空字符串
            if(!$result){
                return ' ';
            }
            //如果超出时间,销毁session
            if($result['utime']+self::$maxlifetime < self::$ctime){
                self::destroy($sid);
                return ' ';
            }
            //如果用户换了IP或换了浏览器
            if($result['uip']!=self::$uip || $result['uagent'] != self::$uagent){
                self::destroy($sid);
                return ' ';
            }
            return $result['sdata'];
        }
        //写入 $_SESSION['username']='yang'
        public static function write($sid,$data){
            echo 'write<br/>'; 
            $query = "select * from session where sid =? ";
            $stmt   = self::$pdo->prepare($query);
            $stmt->execute(array($sid));
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            //若有数据,则更新
            if($result){
                //如果数据和原来的不一样 或者 当前时间大于文件修改时间加30秒的时候 才更新
                if($result['sdata']!=$data || $result['utime']+30< self::$ctime){// +加号优先级高于 <小于号
                $query = "update session set sdata = ?, utime = ? where sid =? ";
                $stmt   = self::$pdo->prepare($query);
                $stmt->execute(array($data,self::$ctime,$sid));
                }
            }else{//插入数据
            if(!empty($data)){
            $query = "insert into session(sid,sdata,utime,uip,uagent) values(?,?,?,?,?)";
            $stmt   = self::$pdo->prepare($query);
            $stmt  -> execute(array($sid,$data,self::$ctime,self::$uip,self::$uagent));
            }
            }
            }
        //销毁 session_destroy
        public static function destroy($sid){
            echo 'destroy<br/>';     
            $query = "delete from session where sid = ?";
            $stmt   = self::$pdo->prepare($query);
           return $stmt  -> execute(array($sid));            
        }
        //回收垃圾
        public static function gc($maxlifetime){
            echo 'gc<br/>';            
            $query = "delete from session where utime < ?";
            $stmt   = self::$pdo->prepare($query);
            return $stmt  -> execute(array(self::$ctime-self::$maxlifetime));
        }
 }
 
 DBSession::start($pdo);

创建session表

 create table session(
 sid char(32) not null default ' ',
 utime int not null default 0,
 sdata text,
 uip char(15) not null default ' ',
 uagent varchar(200) not null default ' ',
 index session_sid(sid)
 );



--结束END--

本文标题: PHP 自定义session储存 数据库 方式类 高洛峰 细说PHP

本文链接: https://www.lsjlt.com/news/41771.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作