




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第PHP中如何使用Redis接管文件存储Session详解php默认使用文件存储session,如果并发量大,效率会非常低。而redis对高并发的支持非常好,可以利用redis替换文件来存储session。
最近就遇到了这个问题,之前找了网上的一套直播系统给客户用,刚开始是没问题的,在后面人数上来之后网站开始变得卡顿,卡的一批。之后查看php慢日志发现session_start()的身影,好吧,原来是万恶的文件存储session,跟我之前进的坑一模一样……之前做的教务查询系统直接用的session没有用cookie,结果在高并发的情况下php原地爆炸。
[0x00007fff67ee6740]session_start()
[0x00007fff67ee7b70]+++dumpfailed
解决方案
将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,代码如下:
classSessionManager{
private$redis;
private$sessionSavePath;
private$sessionName;
private$sessionExpireTime=30;//redis,session的过期时间为30s
publicfunction__construct(){
$this-redis=newRedis();//创建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();
publicfunctionopen($path,$name){
returntrue;
publicfunctionclose(){
returntrue;
publicfunctionread($id){
$value=$this-redis-get($id);//获取redis中的指定记录
if($value){
return$value;
}else{
return'';
publicfunctionwrite($id,$data){
if($this-redis-set($id,$data)){//以sessionID为键,存储
$this-redis-expire($id,$this-sessionExpireTime);//设置redis中数据的过期时间,即session的过期时间
returntrue;
returnfalse;
publicfunctiondestroy($id){
if($this-redis-delete($id)){//删除redis中的指定记录
returntrue;
returnfalse;
publicfunctiongc($maxlifetime){
returntrue;
publicfunction__destruct(){
session_write_close();
}
SessionManager构造函数主要用来连接Redis服务器,使用session_set_save_handler函数设置session回调函数,并调用session_start函数开启session功能。因为本例中open、close和gc回调函数的作用不是很大,所以直接返回true。
在write回调函数中,以sessionID作为key,把session的数据作为value存储到redis服务器,设置session的过期时间为30秒。在read回调函中,以sessionID作为key从redis服务器中读取数据,并返回此数据。而在destroy回调函数重,则以sessionID作为key从redis服务器中删除对应的session数据。
使用时,只需包含SessionManager类,然后实例化一个SessionManager对象。
下面建立个session_set.php文件,代码如下:
include('SessionManager.php');
newSessionManager();
$_SESSION['username']='captain';
然后再创建一个session_get.php文件,代码如下:
include('SessionManager.php');
newSessionManager();
echo$_SESSION['username'];
测试时,首先访问session_set.php,然后再访问session_get.php,输出结果如下所示:
再查看redis数据库,如下所示:
127.0.0.1:6379keys*
1)"oe94eic337slnjv1bvlreoa574"
127.0.0.1:6379getoe94eic337slnjv1bvlreoa574
"username|s:7:\"captai
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 行政效能评估标准的试题及答案
- 医学影像诊断技巧试题及答案总结
- 人员流失风险分析与应对策略
- 深入分析语文试题及答案2025年版
- 经济法与当代时代试题及答案
- 水平提升技巧盘点执业医师考试试题及答案
- 2025年自考行政管理个性化学习试题及答案探讨
- 细化2025年行政管理专科语文考试考点试题及答案
- 新疆哈密地区第二中高二下学期期末考试历史试题
- 中东呼吸综合征病例诊疗方案课件
- 2025全国不动产登记代理人《不动产登记代理实务》考试真题(附完整解析)
- 2025届高考英语二轮复习专题一应用文写作课件
- 2023法律职业资格(主观题)真题带解析
- 2025电力变压器(电抗器)综合监测与预警装置
- 2025年中考化学第一轮复习 课件 2024-2025学年九年级化学人教版下册
- 培训学校合伙协议书
- 湖北省武汉市2025届高中毕业生四月调研考试化学试题及答案(武汉四调)
- 农服公司招聘试题及答案
- 小学生摄影课件
- 2025(标准)承包清工劳务合同协议书范本
- 儿童口腔科诊疗与护理
评论
0/150
提交评论