php实现将Session写入数据库

5年以前  |  阅读数:488 次  |  编程语言:PHP 

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

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

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例