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 相关文章推荐
理解PHP5中static和const关键字的区别
Mar 19 PHP
php debug 安装技巧
Apr 30 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
Jul 28 PHP
php cli模式学习(PHP命令行模式)
Jun 03 PHP
深入解析php中的foreach问题
Jun 30 PHP
PHP中strlen()和mb_strlen()的区别浅析
Jun 19 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
Dec 16 PHP
php检测url是否存在的方法
Apr 14 PHP
PHP 二维数组和三维数组的过滤
Mar 16 PHP
PHP仿微信发红包领红包效果
Oct 30 PHP
php 基础函数
Feb 10 PHP
php微信公众号开发之图片回复
Oct 20 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 visitFile()遍历指定文件夹函数
2010/08/21 PHP
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
小程序scroll-view组件实现滚动的示例代码
2018/09/20 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
JS执行控制之节流模式实例分析
2018/12/21 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
Echarts.js无法引入问题解决方案
2020/10/30 Javascript
easy_install python包安装管理工具介绍
2013/02/10 Python
使用优化器来提升Python程序的执行效率的教程
2015/04/02 Python
Python爬取三国演义的实现方法
2016/09/12 Python
python获取中文字符串长度的方法
2018/11/14 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
Python 实现敏感目录扫描的示例代码
2020/05/21 Python
python爬虫用request库处理cookie的实例讲解
2021/02/20 Python
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
好的演讲稿开场白
2013/12/30 职场文书
社区庆中秋节活动方案
2014/02/07 职场文书
对孩子的寄语
2014/04/09 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
迟到检讨书范文
2015/01/27 职场文书
实习报告怎么写
2019/06/20 职场文书
如何写好活动总结
2019/06/21 职场文书
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle