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代码
Mar 03 PHP
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
Jul 04 PHP
PHP+SQL 注入攻击的技术实现以及预防办法
Dec 29 PHP
关于PHP的相似度计算函数:levenshtein的使用介绍
Apr 15 PHP
php foreach循环中使用引用的问题
Nov 06 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
浅谈PHP中类和对象的相关函数
Apr 26 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
Sep 27 PHP
laravel使用数据库测试注意事项
Apr 10 PHP
imagettftext() 失效,不起作用
Mar 09 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手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
php实现的AES加密类定义与用法示例
2018/01/29 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
JQUERY dialog的用法详细解析
2013/12/19 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
详解js闭包
2014/09/02 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
JS中的三个循环小结
2017/06/20 Javascript
js编写简单的聊天室功能
2017/08/17 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
python进阶教程之词典、字典、dict
2014/08/29 Python
Python魔术方法详解
2015/02/14 Python
Python中title()方法的使用简介
2015/05/20 Python
python 读写中文json的实例详解
2017/10/29 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
详解python算法之冒泡排序
2019/03/05 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
Python GUI库PyQt5样式QSS子控件介绍
2020/02/25 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
欧舒丹美国官网:L’Occitane美国
2018/02/23 全球购物
房地产员工找工作的自我评价
2013/11/15 职场文书
自荐信的基本格式
2014/02/22 职场文书
升职演讲稿范文
2014/05/23 职场文书
降价通知函
2015/04/23 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书