php实现将Session写入数据库


Posted in PHP onJuly 26, 2015

使用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 相关文章推荐
php面向对象全攻略 (十) final static const关键字的使用
Sep 30 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 PHP
新手菜鸟必读:session与cookie的区别
Aug 22 PHP
MongoDB在PHP中的常用操作小结
Feb 20 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 PHP
简单理解PHP的面向对象编程方式
May 17 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
Laravel框架使用Redis的方法详解
May 30 PHP
PHP如何将图片文件上传到另外一台服务器上
Aug 26 PHP
php检测文本的编码
Jul 26 #PHP
PHP中COOKIES使用示例
Jul 26 #PHP
PHP实现简单数字分页效果
Jul 26 #PHP
FastCGI 进程意外退出造成500错误
Jul 26 #PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 #PHP
使用纯php代码实现页面伪静态的方法
Jul 25 #PHP
php正则表达式获取内容所有链接
Jul 24 #PHP
You might like
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
php数组一对一替换实现代码
2012/08/31 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
2015/12/31 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
使用prototype.js 的时候应该特别注意的几个问题.
2007/04/12 Javascript
javascript自定义startWith()和endWith()的两种方法
2013/11/11 Javascript
JS中表单的使用小结
2014/01/11 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
如何抽象一个Vue公共组件
2017/10/17 Javascript
React 高阶组件入门介绍
2018/01/11 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
2019/05/09 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
js防抖函数和节流函数使用场景和实现区别示例分析
2020/04/11 Javascript
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
Python进阶之尾递归的用法实例
2018/01/31 Python
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
优秀毕业生自我鉴定
2014/01/19 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
python基础之类属性和实例属性
2021/10/24 Python
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL