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之sphinx
May 15 PHP
关于初学PHP时的知识积累总结
Jun 07 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
Aug 07 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
Mar 04 PHP
PHP实现过滤各种HTML标签
May 17 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
Jan 14 PHP
浅谈PHP的反射机制
Dec 15 PHP
浅谈php中fopen不能创建中文文件名文件的问题
Feb 06 PHP
php使用curl实现简单模拟提交表单功能
May 15 PHP
PHP中数组转换为SimpleXML教程
Jan 27 PHP
php实现文章评论系统
Feb 18 PHP
laravel框架创建授权策略实例分析
Nov 22 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数组中包含中文的排序方法
2014/06/03 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
JQuery 常用操作代码
2010/03/14 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
mui back 返回刷新页面的实例
2017/12/06 Javascript
Vue header组件开发详解
2018/01/26 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
解决angular2在双向数据绑定时[(ngModel)]无法使用的问题
2018/09/13 Javascript
jQuery动态操作表单示例【基于table表格】
2018/12/06 jQuery
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
Python中title()方法的使用简介
2015/05/20 Python
python字典DICT类型合并详解
2017/08/17 Python
django Serializer序列化使用方法详解
2018/10/16 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
vue+django实现下载文件的示例
2021/03/24 Vue.js
园林设计师自荐信
2013/11/18 职场文书
高中毕业自我评价
2014/02/08 职场文书
高中军训感言200字
2014/02/23 职场文书
公司年会抽奖活动主持词
2014/03/31 职场文书
学习雷锋演讲稿
2014/05/10 职场文书
干部鉴定材料
2014/05/18 职场文书
电子商务求职信
2014/06/15 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
针对吵架老公保证书
2015/05/08 职场文书
南京大屠杀观后感
2015/06/02 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
pnpm对npm及yarn降维打击详解
2022/08/05 Javascript