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 03 PHP
JS中encodeURIComponent函数用php解码的代码
Mar 01 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
Oct 05 PHP
php常用Stream函数集介绍
Jun 24 PHP
zend framework文件上传功能实例代码
Dec 25 PHP
删除html标签得到纯文本可处理嵌套的标签
Apr 28 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
Laravel 5框架学习之Eloquent 关系
Apr 09 PHP
codeigniter实现get分页的方法
Jul 10 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
详解PHP swoole process的使用方法
Aug 26 PHP
PHP使用反向Ajax技术实现在线客服系统详解
Jul 01 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读取文件并可支持远程文件的代码分享
2012/10/03 PHP
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
JS实现简易图片轮播效果的方法
2015/03/25 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
除Console.log()外更多的Javascript调试命令
2018/01/24 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
微信小程序实现录音功能
2019/11/22 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
py2exe 编译ico图标的代码
2013/03/08 Python
Python实现测试磁盘性能的方法
2015/03/12 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
Python中的错误和异常处理简单操作示例【try-except用法】
2017/07/25 Python
python实现word 2007文档转换为pdf文件
2018/03/15 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
对numpy中的transpose和swapaxes函数详解
2018/08/02 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
药学专业大学生个人的自我评价
2013/11/04 职场文书
上课不认真检讨书
2014/09/17 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
搞笑的婚礼主持词
2015/06/29 职场文书