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中常用编辑器推荐
Jan 02 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
php函数间的参数传递(值传递/引用传递)
Sep 23 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
开启PHP的伪静态模式
Dec 31 PHP
thinkPHP查询方式小结
Jan 09 PHP
thinkphp3.x中cookie方法的用法分析
May 19 PHP
PHP页面跳转实现延时跳转的方法
Dec 10 PHP
php中关于换行的实例写法
Sep 26 PHP
php7性能提升的原因详解
Oct 13 PHP
PHP网页缓存技术优点及代码实例
Jul 29 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 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中的实现trim函数代码
2007/03/19 PHP
PHP获取网站域名和地址的代码
2008/08/17 PHP
php多文件上传功能实现原理及代码
2013/04/18 PHP
WAMP环境中扩展oracle函数库(oci)
2015/06/26 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
php源码的安装方法和实例
2019/09/26 PHP
JS基础之undefined与null的区别分析
2011/08/08 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
Javascript实现div层渐隐效果的方法
2015/05/30 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
jQuery实现鼠标悬停3d菜单展开动画效果
2017/01/19 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
python测试驱动开发实例
2014/10/08 Python
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
python 打印对象的所有属性值的方法
2016/09/11 Python
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
python实现七段数码管和倒计时效果
2019/11/23 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
师范生自我鉴定范文
2013/10/05 职场文书
员工自我鉴定
2013/10/09 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
绍兴鲁迅故居导游词
2015/02/09 职场文书
教师求职简历自我评价
2015/03/10 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
2015年维修电工工作总结
2015/04/25 职场文书
2015年村级财务管理制度
2015/08/04 职场文书