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提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
Feb 08 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
Jun 02 PHP
非常好用的两个PHP函数 serialize()和unserialize()
Feb 04 PHP
ThinkPHP结合AjaxFileUploader实现无刷新文件上传的方法
Oct 29 PHP
php设计模式之委托模式
Feb 13 PHP
java模拟PHP的pack和unpack类
Apr 13 PHP
PHP处理CSV表格文件的常用操作方法总结
Jul 01 PHP
php实现带读写分离功能的MySQL类完整实例
Jul 28 PHP
CI框架使用composer安装的依赖包步骤与方法分析
Nov 21 PHP
PHP编程实现csv文件导入mysql数据库的方法
Apr 29 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
php实现的PDO异常处理操作分析
Dec 27 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 在文件指定行插入数据的代码
2010/05/08 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
php调用mysql存储过程实例分析
2014/12/29 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
复制小说文本时出现的随机乱码的去除方法
2010/09/07 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
用IE重起计算机或者关机的示例代码
2014/03/10 Javascript
深入讲解AngularJS中的自定义指令的使用
2015/06/18 Javascript
JS实现仿新浪黄色经典滑动门效果代码
2015/09/27 Javascript
JavaScript性能优化之小知识总结
2015/11/20 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
js仿新浪微博消息发布功能
2017/02/17 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
Django接收post前端返回的json格式数据代码实现
2019/07/31 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
Python venv虚拟环境配置过程解析
2020/07/08 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
岗位竞聘演讲稿
2014/01/10 职场文书
给水工程专业毕业生自荐信
2014/01/28 职场文书
电视节目策划方案
2014/05/16 职场文书
爱护公物演讲稿
2014/09/09 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
小学见习报告
2015/06/23 职场文书
运动会跳远广播稿
2015/08/19 职场文书
班主任经验交流心得体会
2015/11/02 职场文书