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 相关文章推荐
SMARTY学习手记
Jan 04 PHP
MySQL授权问题总结
May 06 PHP
PHP 全角转半角实现代码
May 16 PHP
phpcms模块开发之swfupload的使用介绍
Apr 28 PHP
解析posix与perl标准的正则表达式区别
Jun 17 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
Jun 28 PHP
php内核解析:PHP中的哈希表
Jan 30 PHP
php的ddos攻击解决方法
Jan 08 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
php实现在多维数组中查找特定value的方法
Jul 29 PHP
ZendFramework2连接数据库操作实例
Apr 18 PHP
PHP实用小技巧之调用录像的方法
Dec 05 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获取post中的json数据的实现方法
2011/06/08 PHP
PHPEXCEL 使用小记
2013/01/06 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
PHP多进程编程总结(推荐)
2016/07/18 PHP
万能的php分页类
2017/07/06 PHP
php简单中奖算法(实例)
2017/08/15 PHP
document.designMode的功能与使用方法介绍
2007/11/22 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
JS函数定义方式的区别介绍
2016/03/22 Javascript
Angular的Bootstrap(引导)和Compiler(编译)机制
2016/06/20 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
微信小程序 标签传入数据
2017/05/08 Javascript
浅谈Webpack多页应用HMR卡住问题
2019/04/24 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
如何运行带参数的python脚本
2019/11/15 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
2021/03/03 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
教学大赛获奖感言
2014/01/15 职场文书
文明餐桌活动方案
2014/02/11 职场文书
社团活动总结范文
2014/04/26 职场文书
委托书如何写
2014/08/30 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
汇报材料怎么写
2014/12/30 职场文书
行政经理岗位职责
2015/04/15 职场文书
施工现场安全管理制度
2015/08/05 职场文书
浅谈MySQL 亿级数据分页的优化
2021/06/15 MySQL
利用python做数据拟合详情
2021/11/17 Python
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS