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实现的功能是显示8条基色色带
Oct 09 PHP
基于mysql的bbs设计(二)
Oct 09 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
php 更新数据库中断的解决方法
Jun 05 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
Jun 05 PHP
解析PHP中的正则表达式以及模式匹配
Jun 19 PHP
PHP curl 获取响应的状态码的方法
Jan 13 PHP
详解PHP中的状态模式编程
Aug 11 PHP
PHP实现生成唯一会员卡号
Aug 24 PHP
php利用smtp类实现电子邮件发送
Oct 30 PHP
WordPress中限制非管理员用户在文章后只能评论一次
Dec 31 PHP
ThinkPHP 3使用OSS的方法
Jul 19 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 获得汉字拼音首字母的函数
2009/08/01 PHP
使用PHP遍历文件夹与子目录的函数代码
2011/09/26 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
详解WordPress开发中wp_title()函数的用法
2016/01/07 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
JAVASCRIPT对象及属性
2007/02/13 Javascript
Prototype Hash对象 学习
2009/07/19 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
SinaEditor使用方法详解
2013/12/28 Javascript
JavaScript 实现打印,打印预览,打印设置
2014/12/30 Javascript
JS判断字符串包含的方法
2015/05/05 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
vue 配置多页面应用的示例代码
2018/10/22 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
Python实现的金山快盘的签到程序
2013/01/17 Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
对python中大文件的导入与导出方法详解
2018/12/28 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
html5标记文字_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
Html5之title吸顶功能
2018/06/04 HTML / CSS
Html5移动端适配IphoneX等机型的方法
2019/06/25 HTML / CSS
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
献爱心活动总结
2014/05/07 职场文书
个性与发展自我评价
2015/03/06 职场文书
2016教师暑期培训学习心得体会
2016/01/09 职场文书