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

发布时间 - 2026-01-11 00:58:25    点击率:

对于大访问量的站点使用默认的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  # session存入redis  # session  # redis  # PHP使用Redis替代文件存储Session的方法  # redis 替代php文件存储session的实例  # php Session存储到Redis的方法  # php实现Session存储到Redis  # php+redis实现多台服务器内网存储session并读取示例  # php基于redis处理session的方法  # 浅析PHP分布式中Redis实现Session的方法  # PHP中如何使用Redis接管文件存储Session详解  # 数据存储  # 将其  # 我们可以  # 不存在  # 可以使用  # 有两种  # 速度快  # 大家多多  # 则更  # 新建一个  # 数据库文件  # 实现了  # 序列化  # __construct  # hanlder  # KEY  # function  # getInstance  # var_dump  # gt 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: 标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  公司门户网站制作流程,华为官网怎么做?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel如何为API编写文档_Laravel API文档生成与维护方法  网站建设要注意的标准 促进网站用户好感度!  如何在万网开始建站?分步指南解析  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  如何自定义建站之星模板颜色并下载新样式?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Laravel怎么在Controller之外的地方验证数据  详解Huffman编码算法之Java实现  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何在云服务器上快速搭建个人网站?  ,在苏州找工作,上哪个网站比较好?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  图册素材网站设计制作软件,图册的导出方式有几种?  如何在七牛云存储上搭建网站并设置自定义域名?  HTML 中动态设置元素 name 属性的正确语法详解  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  Laravel如何升级到最新版本?(升级指南和步骤)  Laravel如何记录自定义日志?(Log频道配置)  如何在阿里云通过域名搭建网站?  如何在Windows虚拟主机上快速搭建网站?  iOS发送验证码倒计时应用  🚀拖拽式CMS建站能否实现高效与个性化并存?  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  python中快速进行多个字符替换的方法小结  如何在万网ECS上快速搭建专属网站?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何快速搭建虚拟主机网站?新手必看指南  如何在阿里云购买域名并搭建网站?  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  如何在 Pandas 中基于一列条件计算另一列的分组均值  教你用AI润色文章,让你的文字表达更专业  Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  如何用免费手机建站系统零基础打造专业网站?  Laravel如何处理异常和错误?(Handler示例)  Laravel怎么使用Intervention Image库处理图片上传和缩放  HTML 中如何正确使用模板变量为元素的 name 属性赋值  浅述节点的创建及常见功能的实现  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  html5的keygen标签为什么废弃_替代方案说明【解答】  如何用AWS免费套餐快速搭建高效网站?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何用狗爹虚拟主机快速搭建网站?