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 相关文章推荐
基于文本的留言簿
Oct 09 PHP
php4的session功能评述(三)
Oct 09 PHP
PHP实现邮件群发的源码
Jun 18 PHP
PHP实现图片压缩的两则实例
Jul 19 PHP
PHP反向代理类代码
Aug 15 PHP
destoon调用企业会员公司形象图片的实现方法
Aug 21 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
Nov 17 PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 PHP
分享8个Laravel模型时间戳使用技巧小结
Feb 12 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
Feb 12 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 PHP
PHP使用QR Code生成二维码实例
Jul 07 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类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
强制PHP命令行脚本单进程运行的方法
2014/04/15 PHP
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
php实现微信企业转账功能
2018/10/02 PHP
Thinkphp5框架使用validate实现验证功能的方法
2019/08/27 PHP
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
jQuery实现左右切换焦点图
2015/04/03 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
AngularJS自定义插件实现网站用户引导功能示例
2016/11/07 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
基于AngularJs select绑定数字类型的问题
2018/10/08 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
python实现将内容分行输出
2015/11/05 Python
Python如何生成树形图案
2018/01/03 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
2020/12/21 Python
HTML5新增form控件和表单属性实例代码详解
2019/05/15 HTML / CSS
新浪微博实习心得体会
2014/01/27 职场文书
招股说明书范本
2014/05/06 职场文书
公司优秀员工获奖感言
2014/08/14 职场文书
高中生毕业评语
2014/12/30 职场文书
学年个人总结范文
2015/03/05 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers