PHP中如何使用Redis接管文件存储Session详解

PHP中如何使用Redis接管文件存储Session详解

https://www.jb51.net/article/151580.htm

 

前言

 

php默认使用文件存储session,如果并发量大,效率会非常低。而redis对高并发的支持非常好,可以利用redis替换文件来存储session。

 

最近就遇到了这个问题,之前找了网上的一套直播系统给客户用,刚开始是没问题的,在后面人数上来之后网站开始变得卡顿,卡的一批。之后查看php慢日志发现session_start()的身影,好吧,原来是万恶的文件存储session,跟我之前进的坑一模一样……之前做的教务查询系统直接用的session没有用cookie,结果在高并发的情况下php原地爆炸。

 

 

 

[0x00007fff67ee6740] session_start()
[0x00007fff67ee7b70] +++ dump failed

 

解决方案

 

  • 将session全面更换为cookie

  • 使用mysql或redis接管session

 

 

 

具体实现

 

php有内置的操作session的save_handler,使用session_set_save_handler,接管所有的session管理工作。在使用该函数前,先把php.ini配置文件的session.save_handler选项设置为user,否则session_set_save_handle不会生效。另外除了安装redis之外,php扩展也需要增加redis。

 

 

 

编写一个session管理类sessionManager.php,代码如下:

 

<?php
class SessionManager{

 private $redis;
 private $sessionSavePath;
 private $sessionName;
 private $sessionExpireTime=30;//redis,session的过期时间为30s

 public function __construct(){
  $this->redis = new Redis();//创建phpredis实例
  $this->redis->connect('127.0.0.1',6379);//连接redis
  $this->redis->auth("107lab");//授权
  $retval = session_set_save_handler(
   array($this,"open"),
   array($this,"close"),
   array($this,"read"),
   array($this,"write"),
   array($this,"destroy"),
   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);//获取redis中的指定记录
  if($value){
   return $value;
  }else{
   return '';
  }
 }

 public function write($id,$data){
  if($this->redis->set($id,$data)){ //以session ID为键,存储
   $this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
   return true;
  }

  return false;
 }

 public function destroy($id){
  if($this->redis->delete($id)){ //删除redis中的指定记录
   return true;
  }
  return false;
 }

 public function gc($maxlifetime){
  return true;
 }

 public function __destruct(){
  session_write_close();
 }

}

 

 

 

SessionManager构造函数主要用来连接Redis服务器,使用session_set_save_handler函数设置session回调函数,并调用session_start函数开启session功能。因为本例中open、close和gc回调函数的作用不是很大,所以直接返回true。

 

在write回调函数中,以session ID 作为key,把session的数据作为value存储到redis服务器,设置session的过期时间为30秒。在read回调函中,以session ID 作为key从redis服务器中读取数据,并返回此数据。而在destroy回调函数重,则以session ID 作为key 从redis服务器中删除对应的session数据。

 

使用时,只需包含SessionManager类,然后实例化一个SessionManager对象。

 

下面建立个session_set.php文件,代码如下:

 

<?php
 include('SessionManager.php');
 new SessionManager();
 $_SESSION['username'] = 'captain';

 

 

 

然后再创建一个session_get.php文件,代码如下:

 

<?php
 include('SessionManager.php');
 new SessionManager();
 echo $_SESSION['username'];

 

 

 

测试时,首先访问session_set.php,然后再访问session_get.php,输出结果如下所示:

 

PHP中如何使用Redis接管文件存储Session详解

 

 

再查看redis数据库,如下所示:

 

127.0.0.1:6379> keys *
1) "oe94eic337slnjv1bvlreoa574"
127.0.0.1:6379> get oe94eic337slnjv1bvlreoa574
"username|s:7:\"captain\";"

 

 

 

测试完美~

 

然后将原系统中的session_start()替换成session_set.php的前两行,成功接管

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112607.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Centos7上安装Docker完整版[通俗易懂]

    Centos7上安装Docker完整版[通俗易懂]首先确认你是CentOs7版本: 命令:cat /etc/redhat-release ——————————————————————————————————————————————————————安装步骤:1、 yum安装gcc相关 命令: yum-yinstallgcc(保证能上外网)、yum -y install gcc-c++…

  • 论文精读——CenterNet :Objects as Points[通俗易懂]

    论文精读——CenterNet :Objects as Points[通俗易懂]论文题目:ObjectsasPoints论文地址:https://arxiv.org/pdf/1904.07850.pdf发布时间:2019.4.16机构:UTAustin,UCBerkeley代码:https://github.com/xingyizhou/CenterNetAbstract目标检测识别往往在图像上将目标以轴对称的框形式框出。大…

  • ov7725 stm32_如何给实验培养皿拍照

    ov7725 stm32_如何给实验培养皿拍照平台:STM32ZET6(核心板)+ST-LINK/V2+SD卡+USB串口线+鹰眼OV7725摄像头(注意,为了减少摄像头连线的麻烦,建议初学者选取单片机时选用带有摄像头接口的板子)工程介绍:需要移植FatFs文件系统,同时需要了解BMP位图的存储数据结构,从而实现将摄像头输出的RGB565像素数据直接输出到sd卡上,保存为*.bmp文件。1.BMP位图的存储1.1 数据结构介绍//BMP头文…

  • 相机标定(Camera calibration)

    相机标定(Camera calibration)简介摄像机标定(Cameracalibration)简单来说是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵PP的过程,下面相关的部分主要参考UIUC的计算机视觉的课件(网址Spring2016CS543/ECE549 Computervision)。基本的坐标系:世界坐标系(worldcoordinatesystem);相机坐标系(cameracoordina

  • fvwm使用 1_vw3a1101使用说明书

    fvwm使用 1_vw3a1101使用说明书fvwm是一个X11的窗口管理器,提供虚拟窗口,提供多个桌面。提供键盘命令,控制窗口焦点。支持配置命令和动作命令。fvwm启动时读取配置文件,文件可以在多个位置,但是只有第一个找到的生效:$HOME/.fvwm/config/usr/local/share/fvwm/config$HOME/.fvwm/.fvwm2rc$HOME/.fvwm2rc/usr/local

  • 什么叫分销商_分销是什么意思「详细介绍」带你秒懂[通俗易懂]

    什么叫分销商_分销是什么意思「详细介绍」带你秒懂[通俗易懂]很多创业者在创业的道路上可能都会遇到一个问题那就是分销,但是很多创业者却又不懂分销是什么意思。今天我们抖音创业网大家详细地介绍一下关于分析的意思,绝对让你看完以后秒懂。分销是什么意思解释其实简单来说分销就是我们帮助别人销售商品,但是我们销售出去以后我们可以得到一定的分成,同时在我们的利润允许的情况下我们还可以继续拉下线,让其他的人成为我们的销售员工。分销实际案例模拟假如现在有一个苹果,供货商说这…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号