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脚本的10个技巧(8)
Oct 09 PHP
使用PHP遍历文件目录与清除目录中文件的实现详解
Jun 24 PHP
PHP获取当前url的具体方法全面解析
Nov 26 PHP
php图片缩放实现方法
Feb 20 PHP
ThinkPHP之用户注册登录留言完整实例
Jul 22 PHP
php中in_array函数用法探究
Nov 25 PHP
php实现两个数组相加的方法
Feb 17 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
PHP获取ip对应地区和使用网络类型的方法
Mar 11 PHP
thinkPHP实现将excel导入到数据库中的方法
Apr 22 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
PHP实现登录验证码校验功能
May 17 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
PHP4实际应用经验篇(8)
2006/10/09 PHP
php中的观察者模式简单实例
2015/01/20 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
PHP目录操作实例总结
2016/09/27 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
使用js实现一个可编辑的select下拉列表
2014/02/20 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
使用jQuery实现购物车结算功能
2017/08/15 jQuery
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
js实现头像上传并且可预览提交
2020/12/25 Javascript
在树莓派2或树莓派B+上安装Python和OpenCV的教程
2015/03/30 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
python多线程方式执行多个bat代码
2016/06/07 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
解决项目pycharm能运行,在终端却无法运行的问题
2019/01/19 Python
Django实现学员管理系统
2019/02/26 Python
django基础学习之send_mail功能
2019/08/07 Python
python socket 聊天室实例代码详解
2019/11/14 Python
python 读取串口数据的示例
2020/11/09 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
英国团购网站:Groupon英国
2017/11/28 全球购物
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
《小小雨点》教学反思
2014/02/18 职场文书
社会公德演讲稿
2014/05/20 职场文书
高考励志标语
2014/06/05 职场文书
学生安全责任书模板
2014/07/25 职场文书
学生检讨书范文
2014/10/30 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
2015年社区教育工作总结
2015/05/13 职场文书