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 相关文章推荐
自己前几天写的无限分类类
Feb 14 PHP
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
php 文件缓存函数
Oct 08 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
PHP 登录完成后如何跳转上一访问页面
Jan 14 PHP
php去掉URL网址中带有PHPSESSID的配置方法
Jul 08 PHP
PHP动态输出JavaScript代码实例
Feb 12 PHP
PHP实现链式操作的核心思想
Jun 23 PHP
PHP几个实用自定义函数小结
Jan 25 PHP
php类的自动加载操作实例详解
Sep 28 PHP
php+ajax实现异步上传文件或图片功能
Jul 18 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 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
3
2006/10/09 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
php流量统计功能的实现代码
2012/09/29 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
thinkPHP分组后模板无法加载问题解决方法
2016/07/12 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
2016/12/12 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
Jquery之Ajax运用 学习运用篇
2011/09/26 Javascript
jQuery操作Select选择的Text和Value(获取/设置/添加/删除)
2013/03/06 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
jQuery通过ajax快速批量提交表单数据
2016/10/25 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
详解react-native WebView 返回处理(非回调方法可解决)
2018/02/27 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
python实现ipsec开权限实例
2014/11/11 Python
python实现堆栈与队列的方法
2015/01/15 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
python 列表输出重复值以及对应的角标方法
2019/06/11 Python
Python3+Appium安装使用教程
2019/07/05 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
解决Python3.8运行tornado项目报NotImplementedError错误
2020/09/02 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
业务经理岗位职责
2013/11/11 职场文书
学前教育求职自荐信范文
2013/12/25 职场文书
会计工作心得体会
2014/01/13 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
物业保安员岗位职责
2014/03/14 职场文书
2014年会策划方案
2014/05/11 职场文书
学生退学证明
2015/06/23 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python