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
Smarty模板快速入门
Jan 04 PHP
PHP 文章中的远程图片采集到本地的代码
Jul 30 PHP
php Smarty date_format [格式化时间日期]
Mar 15 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
Jul 22 PHP
PHP 冒泡排序算法的实现代码
Aug 08 PHP
深入解析php之sphinx
May 15 PHP
PHP获取MSN好友列表类的实现代码
Jun 23 PHP
php教程之魔术方法的使用示例(php魔术函数)
Feb 12 PHP
Session的工作机制详解和安全性问题(PHP实例讲解)
Apr 10 PHP
thinkphp循环结构用法实例
Nov 24 PHP
php中Redis的应用--消息传递
Mar 28 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读取xml实例代码
2010/01/28 PHP
PHP企业级应用之常见缓存技术篇
2011/01/27 PHP
PHP5中实现多态的两种方法实例分享
2014/04/21 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
jQuery+HTML5实现图片上传前预览效果
2015/08/20 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
js中最容易被忽视的事件问题大总结
2016/05/15 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
JavaScript中如何判断一个值的类型
2017/09/15 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
2020/08/03 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
[00:32]DOTA2上海特级锦标赛 Ehome战队宣传片
2016/03/03 DOTA
pandas 小数位数 精度的处理方法
2018/06/09 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
Python使用百度翻译开发平台实现英文翻译为中文功能示例
2019/08/08 Python
pandas 对group进行聚合的例子
2019/12/27 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
翻新二手苹果产品的网络领导者:Mac of all Trades
2017/12/19 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
VC++笔试题
2014/10/13 面试题
学员自我鉴定
2014/03/19 职场文书
协议书怎么写
2014/04/21 职场文书
应用外语系自荐信
2014/06/26 职场文书
财务管理专业自荐书
2014/09/02 职场文书
工作作风建设心得体会
2014/10/22 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL