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生成带有雪花背景的验证码
Sep 28 PHP
PHP n个不重复的随机数生成代码
Jun 23 PHP
关于php curl获取301或302转向的网址问题的解决方法
Jun 02 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
微信支付PHP SDK之微信公众号支付代码详解
Dec 09 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
php组合排序简单实现方法
Oct 15 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
Jun 06 PHP
基于swoole实现多人聊天室
Jun 14 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
Aug 21 PHP
php异常处理捕获错误整理
Sep 23 PHP
PHP7 参数处理机制修改
Mar 09 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
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
Laravel实现表单提交
2017/05/07 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
javascript学习笔记(三) String 字符串类型介绍
2012/06/19 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
浅谈webpack 构建性能优化策略小结
2018/06/13 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
Python查询IP地址归属完整代码
2017/06/21 Python
基于django channel实现websocket的聊天室的方法示例
2019/04/11 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
2020/12/15 Python
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
几个SQL的面试题
2014/03/08 面试题
会议邀请函范文
2014/01/09 职场文书
初中生自我鉴定
2014/02/04 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
佛光寺导游词
2015/02/10 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
思品教学工作总结
2015/08/10 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js