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 相关文章推荐
如何过滤高亮显示非法字符
Oct 09 PHP
Discuz板块横排显示图片的实现方法
May 28 PHP
php $_SERVER[&quot;REQUEST_URI&quot;]获取值的通用解决方法
Jun 21 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
phpphp图片采集后按原路径保存图片示例
Feb 18 PHP
php实现数组筛选奇数和偶数示例
Apr 11 PHP
CI框架装载器Loader.php源码分析
Nov 04 PHP
PHP通过插入mysql数据来实现多机互锁实例
Nov 05 PHP
PHP图片处理之图片旋转和图片翻转实例
Nov 19 PHP
学习php设计模式 php实现策略模式(strategy)
Dec 07 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
Swoole源码中如何查询Websocket的连接问题详解
Aug 30 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
配置支持SSI
2006/11/25 PHP
php基于base64解码图片与加密图片还原实例
2014/11/03 PHP
Laravel如何实现自动加载类
2019/10/14 PHP
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
jQuery拖动图片删除示例
2013/05/10 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
jQuery函数map()和each()介绍及异同点分析
2014/11/08 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
js弹出对话框方式小结
2015/11/17 Javascript
详解JavaScript逻辑And运算符
2015/12/04 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
nodejs中使用worker_threads来创建新的线程的方法
2021/01/22 NodeJs
[06:43]DAC2018 4.5 SOLO赛 Maybe vs Paparazi
2018/04/06 DOTA
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
python静态方法实例
2015/01/14 Python
Python实时获取cmd的输出
2015/12/13 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
Lookfantastic葡萄牙官方网站:欧洲第一大化妆品零售商
2018/03/17 全球购物
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
护士毕业自我鉴定
2014/02/07 职场文书
运动会入场词60字
2014/02/15 职场文书
商业企业管理专业求职信
2014/07/10 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
给老婆的保证书
2015/01/16 职场文书
工作转正自我鉴定范文
2019/06/21 职场文书
如何在Python项目中引入日志
2021/05/31 Python
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js