• 售前

  • 售后

热门帖子
入门百科

PHP中怎样使用Redis接受文件存储Session详解

[复制链接]
123457489 显示全部楼层 发表于 2021-10-26 13:18:06 |阅读模式 打印 上一主题 下一主题
媒介

php默认使用文件存储session,如果并发量大,服从会非常低。而redis对高并发的支持非常好,可以使用redis替换文件来存储session。
迩来就碰到了这个问题,之前找了网上的一套直播系统给客户用,刚开始是没问题的,在背面人数上来之后网站开始变得卡顿,卡的一批。之后检察php慢日志发现session_start()的身影,好吧,原来是万恶的文件存储session,跟我之进步的坑千篇一律……之前做的教务查询系统直接用的session没有用cookie,效果在高并发的情况下php原地爆炸。
  1. [0x00007fff67ee6740] session_start()
  2. [0x00007fff67ee7b70] +++ dump failed
复制代码
办理方案
      
  • 将session全面更换为cookie  
  • 使用mysql或redis接受session
坑中坑

由于这套直播系同一没有用框架,二没有计划规范,各种session操纵散落在不同的文件里,用第一个办理方案完全属于费力不讨好。再者直播系统的聊天互动等功能已经涉及大量的mysql操纵,再用mysql接受session变相的增加了数据库的压力,终极确定了使用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,代码如下:
  1. <?php
  2. class SessionManager{
  3. private $redis;
  4. private $sessionSavePath;
  5. private $sessionName;
  6. private $sessionExpireTime=30;//redis,session的过期时间为30s
  7. public function __construct(){
  8.   $this->redis = new Redis();//创建phpredis实例
  9.   $this->redis->connect('127.0.0.1',6379);//连接redis
  10.   $this->redis->auth("107lab");//授权
  11.   $retval = session_set_save_handler(
  12.    array($this,"open"),
  13.    array($this,"close"),
  14.    array($this,"read"),
  15.    array($this,"write"),
  16.    array($this,"destroy"),
  17.    array($this,"gc")
  18.   );
  19.   session_start();
  20. }
  21. public function open($path,$name){
  22.   return true;
  23. }
  24. public function close(){
  25.   return true;
  26. }
  27. public function read($id){
  28.   $value = $this->redis->get($id);//获取redis中的指定记录
  29.   if($value){
  30.    return $value;
  31.   }else{
  32.    return '';
  33.   }
  34. }
  35. public function write($id,$data){
  36.   if($this->redis->set($id,$data)){//以session ID为键,存储
  37.    $this->redis->expire($id,$this->sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
  38.    return true;
  39.   }
  40.   return false;
  41. }
  42. public function destroy($id){
  43.   if($this->redis->delete($id)){//删除redis中的指定记录
  44.    return true;
  45.   }
  46.   return false;
  47. }
  48. public function gc($maxlifetime){
  49.   return true;
  50. }
  51. public function __destruct(){
  52.   session_write_close();
  53. }
  54. }
复制代码
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文件,代码如下:
  1. <?php
  2. include('SessionManager.php');
  3. new SessionManager();
  4. $_SESSION['username'] = 'captain';
复制代码
然后再创建一个session_get.php文件,代码如下:
  1. <?php
  2. include('SessionManager.php');
  3. new SessionManager();
  4. echo $_SESSION['username'];
复制代码
测试时,首先访问session_set.php,然后再访问session_get.php,输出效果如下所示:

再检察redis数据库,如下所示:
  1. 127.0.0.1:6379> keys *
  2. 1) "oe94eic337slnjv1bvlreoa574"
  3. 127.0.0.1:6379> get oe94eic337slnjv1bvlreoa574
  4. "username|s:7:"captain";"
复制代码
测试完美~

然后将原系统中的session_start()替换成session_set.php的前两行,乐成接受,惬意。
总结
以上就是这篇文章的全部内容了,盼望本文的内容对各人的学习或者工作具有一定的参考学习代价,如果有疑问各人可以留言互换,谢谢各人对草根技术分享的支持。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作