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创建多级目录代码
Jun 05 PHP
php array_walk() 数组函数
Jul 12 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
php一维二维数组键排序方法实例总结
Nov 13 PHP
PHP使用memcache缓存技术提高响应速度的方法
Dec 26 PHP
PHP动态规划解决0-1背包问题实例分析
Mar 23 PHP
WordPress中用于更新伪静态规则的PHP代码实例讲解
Dec 18 PHP
PHP正则表达式入门教程(推荐)
May 18 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
PHP下载远程图片的几种方法总结
Apr 07 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 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实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
CheckBox 如何实现全选?
2006/06/23 Javascript
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
javascript arguments 传递给函数的隐含参数
2009/08/21 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
用jquery统计子菜单的条数示例代码
2013/10/18 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
微信小程序实现评论功能
2018/11/28 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
js实现石头剪刀布游戏
2020/10/11 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
[01:09]2014DOTA2国际邀请赛 TI4西雅图DOTA2 中国美女coser加油助威
2014/07/20 DOTA
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
python中执行shell的两种方法总结
2017/01/10 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
Django如何批量创建Model
2020/09/01 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
信用社实习人员自我鉴定
2013/09/20 职场文书
趣味运动会活动方案
2014/02/12 职场文书
办公设备采购方案
2014/03/16 职场文书
学历公证书范本
2014/04/09 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
关于运动会广播稿200字
2014/10/08 职场文书
Java 在线考试云平台的实现
2021/11/23 Java/Android
Android Studio 计算器开发
2022/05/20 Java/Android