php实现Session存储到Redis


Posted in PHP onNovember 11, 2015

对于大访问量的站点使用默认的Session 并不合适,我们可以将其存入数据库、或者使用Redis KEY-VALUE数据存储方案
首先新建一个session表

CREATE TABLE `sessions` (
 `sid` char(40) NOT NULL,
 `updatetime` int(20) NOT NULL,
 `data` varchar(200) NOT NULL,
 UNIQUE KEY `sid` (`sid`) USING HASH
) ENGINE=MEMORY DEFAULT CHARSET=utf8;

Mysql 的memory引擎采用内存表,所有数据存储在内存,操作速度快

<?php
//引入数据库文件
include "db.php";
class MySessionHandler implements SessionHandlerInterface
{
  private $savePath;
  private $sessData;
  public $expiretime;  //设置过期时间
  public $db;  //数据库
  public function __construct($hanlder =''){
     
    $this->db = Database::getInstance();  
     
    //获取数据库实力 
    ///var_dump($this->db);
     
  }
   
  public function open($savePath, $sessionName)
  {
 
    return true;
  }
 
  public function close()
  {
    return true;
  }
 
  public function read($id)
  {  
    $sql ="select * from sessions where sid ='$id'";
    $result = $this->db->execute($sql);
      if(!empty($result)){
         return $this->sessData = $result;
      }
  }
      //函数的参数 $id -> 当前会话ID
      //数据DATA -> 序列化之后的字符串
  public function write($id, $data)
  {
    // echo $id;
    // echo $data;
    $now = time();
    $newExp = $now+$this->expiretime;  //总时间=当前时间 + 期限时间
    $sql = "select * from sessions where sid ='$id'";
    $result = $this->db->getOne($sql);
    //var_dump($result);
    if($data==''||isset($data)){
      $data = $this->sessData;
    }
      if($result){
      //如果存在则更新
  $sql ="update sessions set updatetime = '$newExp',data ='$data' where sid = '$id'";
        //echo $sql;
          $update_data =$this->db->execute($sql);
          if($update_data){
            return true;
          }
         
      }else{
      //不存在则生成生成
  $sql = "insert into sessions(sid,updatetime,data) values('$id','$now','$data')";
    $insert_data = $this->db->execute($sql);
    if($insert_data){
    return true;
        }
      }
      return false;
  }
 
  public function destroy($id)
  {    //销毁
    $sql = "delete from sessions where sid="."$id";
    $destory = $this->db->execute($sql);
    if($destory){
       return true;
    }else{
      return false;
    }
  }
 
  public function gc($sessMaxLifeTime)
  {
   $t = time();
  $sql ="delete from sessions where $t - 'updatetime'>${sessMaxLifeTime}";
    $data = $this->db->execute($this->tosql);
    if($data){
      return true;
    }else{
      return false;
      }
    return true;
  }
}

实例化

此处 PHP 手册可以有两种方法
1,实现了SessionHandlerInterface借口的对象,自PHP5.4可以使用
2 ,直接使用  session_set_save_handler

//判断PHP版本
 if(version_compare(PHP_VERSION,5.4)==1){
       
   session_set_save_handler($handler, true);
  session_start();
  }else{  
    ini_set('session.use_trans_sid',0);
    ini_set('session.use_cookies',1);
    ini_set('session.cookie_path','/');
      ini_set('session.save_handler','user');
      session_module_name('user');
      session_set_save_handler(array($session,"open"),array($session,"close"),array($session,"read"),array($session,"write"),array($session,"destory"),array($session,"gc"));
      session_start();   
     }
$_SESSION['QQ']="QQ";
echo $_SESSION['QQ'];

数据库代码

<?php 
class Database{
     static $instance;
    static $db;
  static function getInstance(){   
    if(self::$instance){
      return self::$instance;
    }else{
      return new Database();  
    }
  }
  public function __construct(){
    self::$db = new PDO('mysql:host=localhost;dbname=session', 'root','');
  }
 
    public function getOne($sql){
      $rs =self::$db->query($sql);
      @$rs->setFetchMode(PDO::FETCH_ASSOC);//返回关联数组
      $result = $rs -> fetch();
      return $result;
    }
    public function execute($sql){
       
       
        $rs = self::$db->exec($sql);
        return $rs;
         
    } 
   
 
} 
//$data = Database::getInstance();
//var_dump($data);

  使用REDIS 存储SESSION

<?php
class SessionManager{
  private $redis;
  private $sessionSavePath;
  private $sessionName;
  private $sessionExpireTime = 30;
  public function __construct(){
    $this->redis = new Redis();
    $this->redis->connect('127.0.0.1',6379);  //连接redis
    $retval = session_set_save_handler(
      array($this,"open"),
      array($this,"close"),
      array($this,"read"),
      array($this,"write"),
      array($this,"destory"),
      array($this,"gc")
    );
      session_start();
  }
   
    public function open($path,$name){
      return true;
    }
    public function close(){
      return true;
    }
    public function read($id){
      $value = $this->redis->get($id);
      if($value){
        return $value;
      }else{
        return "";
      }
    }
    public function write($id,$data){
      if($this->redis->set($id,$data)){
        $this->redis->expire($id,$this->sessionExpireTime); 
         //设置过期时间
        return true;
      }
      return false;
    }
    public function destory($id){
      if($this->redis->delete($id)){
        return true;
      }
      return false;
    }
    public function gc($maxlifetime){
      return true;
    }
    //析构函数
    public function __destruct(){
      session_write_close();
    }
     
} 
$re = new SessionManager();
$_SESSION['name'] = "qq";
echo $_SESSION['name'];

以上就是详细的介绍了php实现Session存储到Redis的方法,希望对大家的学习有所帮助。

PHP 相关文章推荐
PHP调用三种数据库的方法(1)
Oct 09 PHP
收集的DedeCMS一些使用经验
Mar 17 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
Nov 29 PHP
PHP页面间参数传递的四种方法详解
Jun 09 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
Aug 06 PHP
PHP删除数组中空值的方法介绍
Apr 14 PHP
php中最简单的字符串匹配算法
Dec 16 PHP
php从数组中随机选择若干不重复元素的方法
Mar 14 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
laravel 5.4中实现无限级分类的方法示例
Jul 27 PHP
php中的buffer缓冲区用法分析
May 31 PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 PHP
PHP防止刷新重复提交页面的示例代码
Nov 11 #PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
Nov 11 #PHP
深入php内核之php in array
Nov 10 #PHP
谈谈你对Zend SAPIs(Zend SAPI Internals)的理解
Nov 10 #PHP
php实现可运算的验证码
Nov 10 #PHP
如何使用PHP Embed SAPI实现Opcodes查看器
Nov 10 #PHP
深入理解PHP内核(二)之SAPI探究
Nov 10 #PHP
You might like
thinkphp循环结构用法实例
2014/11/24 PHP
yii2.0数据库迁移教程【多个数据库同时同步数据】
2016/10/08 PHP
php通过header发送自定义数据方法
2018/01/18 PHP
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
2006/12/06 Javascript
greybox——不开新窗口看新的网页
2007/02/20 Javascript
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
jQuery网页定位导航特效实现方法
2016/12/19 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
Python中使用glob和rmtree删除目录子目录及所有文件的例子
2014/11/21 Python
python快速建立超简单的web服务器的实现方法
2018/02/17 Python
python斐波那契数列的计算方法
2018/09/27 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
scrapy利用selenium爬取豆瓣阅读的全步骤
2020/09/20 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
德国运动鞋网上商店:Afew Store
2018/01/05 全球购物
DJI全球:DJI Global
2021/03/15 全球购物
求职信内容考虑哪几点
2013/10/05 职场文书
货代行业个人求职简历的自我评价
2013/10/22 职场文书
建筑施工员岗位职责
2013/11/26 职场文书
小学生作文评语大全
2014/04/21 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
详解Redis实现限流的三种方式
2021/04/27 Redis
关于MySQL中explain工具的使用
2023/05/08 MySQL