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 相关文章推荐
推荐一篇入门级的Class文章
Mar 19 PHP
15种PHP Encoder的比较
Apr 17 PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 PHP
解析关于wamp启动是80端口被占用的问题
Jun 21 PHP
Drupal7 form表单二次开发要点与实例
Mar 02 PHP
使用PHP函数scandir排除特定目录
Jun 12 PHP
PHP身份证校验码计算方法
Aug 10 PHP
php代码检查代理ip的有效性
Aug 19 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
Yii框架操作cookie与session的方法实例详解
Sep 04 PHP
php 中的信号处理操作实例详解
Mar 04 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中利用XML技术构造远程服务(下)
2006/10/09 PHP
php下过滤HTML代码的函数
2007/12/10 PHP
php 无极分类(递归)实现代码
2010/01/05 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
PHP比较运算符的详细介绍
2015/09/29 PHP
简单谈谈PHP中的trait
2017/02/25 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
基于PHP实现生成随机水印图片
2020/12/09 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
JavaScript的类型简单说明
2010/09/03 Javascript
jQuery+JSON+jPlayer实现QQ空间音乐查询功能示例
2013/06/17 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
js 图片懒加载的实现
2020/10/21 Javascript
Python验证码识别的方法
2015/07/10 Python
python如何在终端里面显示一张图片
2016/08/17 Python
python虚拟环境virualenv的安装与使用
2016/12/18 Python
Python中查看文件名和文件路径
2017/03/31 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
简单介绍django提供的加密算法
2019/12/18 Python
python实现文法左递归的消除方法
2020/05/22 Python
python对一个数向上取整的实例方法
2020/06/18 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
医药专业推荐信
2013/11/15 职场文书
葡萄牙语专业个人求职信
2013/12/10 职场文书
探亲邀请信范文
2014/01/30 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
班干部演讲稿
2014/04/24 职场文书
实验心得体会
2014/09/05 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery
《王者天下》第4季首话新剧照 4月9日正式开播
2022/04/07 日漫