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 相关文章推荐
用session做客户验证时的注意事项
Oct 09 PHP
PHP 定界符 使用技巧
Jun 14 PHP
PHP 开源框架22个简单简介
Aug 24 PHP
CodeIgniter框架中_remap()使用方法2例
Mar 10 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
php实现根据字符串生成对应数组的方法
Sep 22 PHP
PHPExcel内存泄漏问题解决方法
Jan 23 PHP
php正则替换处理HTML页面的方法
Jun 17 PHP
Yii2.0高级框架数据库增删改查的一些操作
Nov 16 PHP
smarty模板数学运算示例
Dec 11 PHP
thinkphp5.1 文件引入路径问题及注意事项
Jun 13 PHP
php实现简易计算器
Aug 28 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的header和asp中的redirect比较
2006/10/09 PHP
优化php效率,提高php性能的一些方法
2011/03/24 PHP
PHP获取页面执行时间的方法(推荐)
2016/12/10 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
2018/10/14 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
使用jQuery模板来展现json数据的代码
2010/10/22 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
推荐4个原生javascript常用的函数
2015/01/12 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
13个PHP函数超实用
2015/10/21 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
Vue实例中生命周期created和mounted的区别详解
2017/08/25 Javascript
js面向对象方式实现拖拽效果
2021/03/03 Javascript
[01:42]DOTA2 – 虚无之灵
2019/08/25 DOTA
python实现通过代理服务器访问远程url的方法
2015/04/29 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
python实现简易淘宝购物
2019/11/22 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
Pycharm如何导入python文件及解决报错问题
2020/05/10 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
Python3利用openpyxl读写Excel文件的方法实例
2021/02/03 Python
使用phonegap创建联系人的实现方法
2017/03/30 HTML / CSS
美国渔具店:FishUSA
2019/08/07 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
翻译专业应届生求职信
2013/11/23 职场文书
校班主任推荐信范文
2013/12/03 职场文书
应聘护士求职信
2014/07/21 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
学生犯错保证书
2015/05/09 职场文书
心理健康教育主题班会
2015/08/13 职场文书
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers
Python Matplotlib绘制动画的代码详解
2022/05/30 Python