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去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php常用字符串比较函数实例汇总
Nov 24 PHP
php第一次无法获取cookie问题处理
Dec 15 PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
Jan 22 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
Mar 31 PHP
php及codeigniter使用session-cookie的方法(详解)
Apr 06 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 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
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
浅析php与数据库代码开发规范
2013/08/08 PHP
PHP实现绘制3D扇形统计图及图片缩放实例
2014/10/01 PHP
php_pdo 预处理语句详解
2016/11/21 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
Node.js中.pfx后缀文件的处理方法
2017/03/10 Javascript
详解React Native顶|底部导航使用小技巧
2017/09/14 Javascript
js实现弹窗效果
2020/08/09 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
Python实现爬取逐浪小说的方法
2015/07/07 Python
Django与JS交互的示例代码
2017/08/23 Python
Python内置函数——__import__ 的使用方法
2017/11/24 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
Django REST framework 分页的实现代码
2019/06/19 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
女士鞋子、包包和服装在线,第一款10美元:ShoeDazzle
2019/07/26 全球购物
杭州时比特电子有限公司SQL
2013/08/22 面试题
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
教师自我反思材料
2014/02/14 职场文书
安全生产年活动总结
2014/08/29 职场文书
教师党员自我评价2015
2015/03/04 职场文书
费城故事观后感
2015/06/10 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
红色故事汇观后感
2015/06/18 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
2019年工作总结范文
2019/05/21 职场文书
「月刊Action」2022年5月号封面公开
2022/03/21 日漫
Python中的 No Module named ***问题及解决
2022/07/23 Python