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中文本数据翻页(留言本翻页)
Oct 09 PHP
将OICQ数据转成MYSQL数据
Oct 09 PHP
PHP中include()与require()的区别说明
Mar 10 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
Nov 10 PHP
新浪SAE搭建PHP项目教程
Jan 28 PHP
php检查是否是ajax请求的方法
Apr 16 PHP
PHP限制HTML内容中图片必须是本站的方法
Jun 16 PHP
php链表用法实例分析
Jul 09 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
php二维码生成以及下载实现
Sep 28 PHP
PHP二维索引数组的遍历实例分析【2种方式】
Jun 24 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
Oct 30 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实现下载限制速度示例分享
2014/02/13 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
php猜单词游戏
2015/09/29 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
JavaScript操作XML/HTML比较常用的对象属性集锦
2015/10/30 Javascript
基于HTML5上使用iScroll实现下拉刷新,上拉加载更多
2016/05/21 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
EasyUI 结合JS导出Excel文件的实现方法
2016/11/10 Javascript
react 父子组件之间通讯props
2018/09/08 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
react-native聊天室|RN版聊天App仿微信实例|RN仿微信界面
2019/11/12 Javascript
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
Python中的time模块与datetime模块用法总结
2016/06/30 Python
django模板结构优化的方法
2019/02/28 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
英国最大的百货公司:Harrods
2016/08/18 全球购物
腾讯公司的一个sql题
2013/01/22 面试题
创新型城市实施方案
2014/03/06 职场文书
工厂门卫岗位职责范本
2014/04/04 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
2014年安全生产责任书
2014/07/22 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
荆州古城导游词
2015/02/06 职场文书
慰问信范文
2015/02/14 职场文书
2016年端午节寄语
2015/12/04 职场文书
小学英语听课心得体会
2016/01/14 职场文书
2019年个人工作总结范文(3篇)
2019/08/27 职场文书
如何使JavaScript休眠或等待
2021/04/27 Javascript