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

这里,介绍下php的 session_set_save_handler 函数的作用和使用方法。该函数定义用户级session保存函数(如打开、关闭、写入等)。原型如下:

bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)

session_set_save_handler 函数各参数作用如下表

参 数
描述
open
当session打开时调用此函数。接收两个参数,第一个参数是保持session的路径,第二个参数是session的名字
close
当session操作完成时调用此函数。不接收参数。
read
以session ID作为参数。通过session ID从数据存储方中取得数据,并返回此数据。如果数据为空,可以返回一个空字符串。此函数在调用 session_start 前被触发
write
当数据存储时调用。有两个参数,一个是session ID,另外一个是session的数据
destroy
当调用 session_destroy 函数时触发destroy函数。只有一个参数 session ID
gc
当php执行session垃圾回收机制时触发

在使用该函数前,先把php.ini配置文件的session.save_handler选项设置为user,否则session_set_save_handle 不会生效。

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

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文件。输入代码

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

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

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

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

PHP中Redis替代文件存储Session语句的更多相关文章

  1. PHP中使用Redis接管文件存储Session详解

    前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用redis替换文件来存储session. 最近就遇到了这个问题,之前找了网上的一套直播 ...

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

    https://www.jb51.net/article/151580.htm 前言 php默认使用文件存储session,如果并发量大,效率会非常低.而redis对高并发的支持非常好,可以利用red ...

  3. vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令

    目录 1,前言 2,.env文件的作用 3,配置.env文件 4,配置启动命令 5,获取.env中的全局变量 5,实际用处 1,前言 分享一下vue项目中利用.env文件存储全局环境变量,以及利于项目 ...

  4. WinForm中使用XML文件存储用户配置及操作本地Config配置文件

    大家都开发winform程序时候会大量用到配置App.config作为保持用户设置的基本信息,比如记住用户名,这样的弊端就是每个人一些个性化的设置每次更新程序的时候会被覆盖. 故将配置文件分两大类: ...

  5. WinForm中使用XML文件存储用户配置及操作本地Config配置文件(zt)

    因项目中采用CS结构读取Web.config文件,故参照一下的连接完成此功能,在此感谢原作者! 原文地址: http://www.cnblogs.com/zfanlong1314/p/3623622. ...

  6. 实现基于文件存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...

  7. 深入了解Kafka【二】工作流程及文件存储机制

    1.Kafka工作流程 Kafka中的消息以Topic进行分类,生产者与消费者都是面向Topic处理数据. Topic是逻辑上的概念,而Partition是物理上的概念,每个Partition分为多个 ...

  8. redis/分布式文件存储系统/数据库 存储session,解决负载均衡集群中session不一致问题

    先来说下session和cookie的异同 session和cookie不仅仅是一个存放在服务器端,一个存放在客户端那么笼统 session虽然存放在服务器端,但是也需要和客户端相互匹配,试想一个浏览 ...

  9. springboot项目中的普通Session和使用redis存储session

    普通session: session store type使用来存放session的存储方式,目前Spring boot中只支持Redis方式, 由于本应用暂无需将session放入redis的需求, ...

随机推荐

  1. Java学习——变量类型

    Java有3类变量 局部变量 成员变量(实例变量) 类变量(静态变量) 局部变量 局部变量声明在方法.构造方法或者语句块中: 局部变量在方法.构造方法.或者语句块被执行的时候创建,当它们执行完成后,变 ...

  2. iOS使用代码截图

    /** * 截图代码 * * @param view 需要截图的view * @param rect 需要截取的区域 * * @return 返回截取的对象 */ + (UIImage *)viewS ...

  3. DG - logical standby switchover切换过程

    从11g起,主库和逻辑备库之间切换不再需要关闭任何数据库实例. 1.检查主数据库是否处于考虑切换状态 SQL> select switchover_status from v$database; ...

  4. EF Code First DataAnnotations

    Key EF框架要求每个实体必须有主键字段,他需要根据这个主键字段跟踪实体.CodeFirst方法在创建实体时,也必须指定主键字段,默认情况下属性被命名为ID.id或者[ClassName]Id,将映 ...

  5. swift语言实战晋级-第9章 游戏实战-跑酷熊猫-7-8 移动平台的算法

    在上个小节,我们完成了平台的产生.那么我们来实现一下让平台移动.平台的移动,我们只需要在平台工厂类中写好移动的方法,然后在GameScene类中统一控制就行了. 在GameScene类中,有个upda ...

  6. iis access denied, you do not have permission.

    this kind of problems are usually caused by some IIS configuration issues, like application pool set ...

  7. hdu5255 魔法因子

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5255 首先先预处理出一个p,使得p*因子X等于一个整数,且p最小,设q=p*X. 则题目则可以看成存在 ...

  8. springday03-go2

    新建springmvc01项目1.创建项目,导入jar包 拷贝jar/spring/first下的五个spring的jar包,以及jar/spring/mvc下的两个mvcjar包放在lib下 2.创 ...

  9. start.s 解析(一)

    可以参考 : http://blog.csdn.net/bluesummerg/article/details/5940452 (强大的反汇编) http://www.cnblogs.com/yanh ...

  10. FlexNOC

    arteris公司提供一系列工具,来完成NOC的生成,包括model,netlist,TB,script 生成包括三个阶段: NoC specification Phase:使用FlexArtist ...