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 相关文章推荐
Eclipse中php插件安装及Xdebug配置的使用详解
Apr 25 PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
php缓冲输出实例分析
Jan 05 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
Mar 19 PHP
php实现简单的MVC框架实例
Sep 23 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
Sep 23 PHP
PHP实现上传多图即时显示与即时删除的方法
May 09 PHP
由php中字符offset特征造成的绕过漏洞详解
Jul 07 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
Yii框架getter与setter方法功能与用法分析
Oct 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
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
判断多个元素(RADIO,CHECKBOX等)是否被选择的原理说明
2009/02/18 Javascript
jQuery 锚点跳转滚动条平滑滚动一句话代码
2010/04/30 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
jquery模拟进度条实现方法
2015/08/03 Javascript
JavaScript中对DOM节点的访问、创建、修改、删除
2015/11/16 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
node.js 和HTML5开发本地桌面应用程序
2016/12/13 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
简单了解vue 插值表达式Mustache
2020/07/22 Javascript
[01:16:50]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第一场 3月7日
2021/03/11 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
python使用pyhook监控键盘并实现切换歌曲的功能
2014/07/18 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
python多任务及返回值的处理方法
2019/01/22 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
使用python求解二次规划的问题
2020/02/29 Python
学python爬虫能做什么
2020/07/29 Python
世界最大的海报和艺术印刷商店:AllPosters.com
2017/02/01 全球购物
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
甲方资料员岗位职责
2013/12/13 职场文书
运动会通讯稿400字
2014/01/28 职场文书
社区党建工作方案
2014/06/10 职场文书
人事任命通知书
2015/04/21 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
《藏戏》教学反思
2016/02/23 职场文书
终止合同协议书范本
2016/03/22 职场文书
Django Paginator分页器的使用示例
2021/06/23 Python