PHP实现Session入库/存入redis的方法


Posted in PHP onMay 04, 2017

对于大访问量的站点使用默认的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'];

数据库代码 db.php

<?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 相关文章推荐
刚才在简化php的库,结果发现很多东西
Dec 31 PHP
php 操作调试的方法
Jul 12 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
php二维数组用键名分组相加实例函数
Nov 06 PHP
Windows下的PHP安装pear教程
Oct 24 PHP
ucenter通信原理分析
Jan 09 PHP
利用“多说”制作留言板、评论系统
Jul 14 PHP
joomla组件开发入门教程
May 04 PHP
php 使用fopen函数创建、打开文件详解及实例代码
Sep 24 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
CI框架简单分页类用法示例
Jun 06 PHP
浅谈Laravel中使用Slack进行异常通知
May 29 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 #PHP
PHP+jQuery实现滚屏无刷新动态加载数据功能详解
May 04 #PHP
PHP调用Mailgun发送邮件的方法
May 04 #PHP
PHP实现图片的等比缩放和Logo水印功能示例
May 04 #PHP
Yii2数据库操作常用方法小结
May 04 #PHP
Yii2中添加全局函数的方法分析
May 04 #PHP
Yii2表单事件之Ajax提交实现方法
May 04 #PHP
You might like
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
php数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
RR vs IO BO3 第二场2.13
2021/03/10 DOTA
跨浏览器通用、可重用的选项卡tab切换js代码
2011/09/20 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
jQuery实现模拟marquee标签效果
2015/07/14 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
JavaScript使用math.js进行精确计算操作示例
2018/06/19 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
2020/11/03 Javascript
五句话帮你轻松搞定js原型链
2020/12/09 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
详解Python的Django框架中的通用视图
2015/05/04 Python
python实现unicode转中文及转换默认编码的方法
2017/04/29 Python
使用Kivy将python程序打包为apk文件
2017/07/29 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
2020/07/20 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
Python分支语句与循环语句应用实例分析
2019/05/07 Python
python time()的实例用法
2020/11/03 Python
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
园林设计师自荐信
2013/11/18 职场文书
个人简历自荐信
2014/06/26 职场文书
离婚协议书范本2014
2014/10/27 职场文书
论文评审意见
2015/06/05 职场文书
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript