存储如何让文件小一点_如何使用Redis接管文件存储

b1cbb252884004170204fb5448e176d8.gif

文章来自于脚本之家

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

商务合作的请加微信(QQ):2230304070

b1040c9d2be5f19ffb76eb00e6632250.gif 725ccff44f88c17efcdae00ab9163ef3.png

分享教程

a562ad986ec909bca465b1a1c17ab8af.png

链接放在公众号里是最好的,过期了就可以修改,所以这就是不放在文章里的原因,请看清楚这段话好吗:有需要的可以关注“PHP自学中心”,回复对应的关键词,获取链接与提取码。感谢大家的支持与信任

Git && SVN 版本管理视频教程
链接:https://pan.baidu.com/s/1kU6fbKz 
密码:本公众号里回复关键词:20190102

725ccff44f88c17efcdae00ab9163ef3.png

文章正文

a562ad986ec909bca465b1a1c17ab8af.png

前言

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的过期时间为30spublic 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,输出结果如下所示:

e4d3cde2a9b2b28d91075ad8ba856ad0.png

再查看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的前两行,成功接管

a89a0ae58af8652f082f4011cec05738.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值