45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 编程代码 > 阅读资讯:怎么样在php中实现Session存储到Redis?

怎么样在php中实现Session存储到Redis?

2016-03-02 22:59:37 来源:www.45fan.com 【

怎么样在php中实现Session存储到Redis?

对于大访问量的站点使用默认的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的方法,希望对大家的学习有所帮助。


本文地址:http://www.45fan.com/bcdm/41009.html
Tags: 实现 PHP session
编辑:路饭网
推广内容
推荐阅读
热门推荐
推荐文章
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部