基于redis的处理session的方法

一个基于redis的处理session的方法,如下。

 1 <?php
 2 class Session_custom {
 3     private $redis; // redis实例
 4     private $prefix = ‘sess_‘; // session_id前缀
 5
 6     // 会话开始时,会执行该方法,连接redis服务器
 7     public function open($path, $name) {
 8         $this->redis = new Redis();
 9         return $this->redis->connect("127.0.0.1",6379);
10     }
11
12     // 会话结束时,调用该方法,关闭redis连接
13     public function close() {
14         $this->redis->close();
15         return true;
16     }
17
18     // 会话保存数据时调用该方法,在脚本执行完或session_write_close方法调用之后调用
19     public function write($session_id, $data) {
20         return $this->redis->hMSet($this->prefix.$session_id, array(‘expires‘ => time(), ‘data‘ => $data));
21     }
22
23     // 在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。
24     public function read($session_id) {
25         if($this->redis->exists($this->prefix.$session_id)) {
26             return $this->redis->hGet($this->prefix.$session_id, ‘data‘);
27         }
28         return ‘‘;
29     }
30
31     // 清除会话中的数据,当调用session_destroy()函数,或者调用 session_regenerate_id()函数并且设置 destroy 参数为 TRUE 时,会调用此回调函数。
32     public function destroy($session_id) {
33         if($this->redis->exists($this->prefix.$session_id)) {
34             return $this->redis->del($this->prefix.$session_id) > 0 ? true : false;
35         }
36         return true;
37     }
38
39     // 垃圾回收函数,调用周期由 session.gc_probability 和 session.gc_divisor 参数控制
40     public function gc($maxlifetime) {
41         $allKeys = $this->redis->keys("{$this->prefix}*");
42         foreach($allKeys as $key) {
43             if($this->redis->exists($key) && $this->redis->hGet($key, ‘expires‘) + $maxlifetime < time()) {
44                 $this->redis->del($key);
45             }
46         }
47         return true;
48     }
49 }
50
51 // 调用自定义的session处理方法
52 $handler = new Session_custom();
53 session_set_save_handler(
54     array($handler, ‘open‘),
55     array($handler, ‘close‘),
56     array($handler, ‘read‘),
57     array($handler, ‘write‘),
58     array($handler, ‘destroy‘),
59     array($handler, ‘gc‘)
60 );
61
62 // 下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为,表示当脚本执行之后或调用exit()之后,存储当前会话数据并关闭当前会话
63 register_shutdown_function(‘session_write_close‘);
64
65 session_start();
66
67 // 可以使用session了

补充:

php.ini文件中的session.gc_probability与session.gc_divisor两个配置选项共同决定gc函数调用的时机。默认值分为为1和1000,表示每个请求只有1/1000的机会调用gc函数。

时间: 2024-07-31 14:26:38

基于redis的处理session的方法的相关文章

基于Redis实现分布式Session

1.概述 我们可以自己实现类似Session的机制,采用 Redis 等分布式缓存中间件来实现. Redis是独立于应用服务器的,基于Redis实现的Session机制自动具备了分布式属性. Redis可以很方便地做集群配置,则Session避免了单点故障. 2.实现 实现代码极其简单,如下所示. /** * @author liuhailong2008#foxmail */ public class ApiSession implements Serializable { private st

基于Redis缓存的Session共享测试(转)

本机ip为192.168.1.101 1.准备测试环境 两个Tomcat 在Eclipse中新建2个Servers,指定对应的Tomcat,端口号错开. Tomcat1(18005.18080.18009) Tomcat2(28005.28080.28009) 一个Redis Redis下载官网(http://redis.io),这里用的是2.6版本. 解压开来后直接运行redis-server.exe即启动了Redis. 在命令行中cd到Redis的解压目录,通过redis-cli工具进入Re

Tomcat7基于Redis的Session共享实战二

目前,为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无论用户的请求被转发到哪个服务器上都能保证用户的正常使用,即需要实现session的共享机制. 在集群系统下实现session统一的有如下几种方案:(1) 应用服务器间的session复制共享(如tomcat自带session共享)(2) 基于cache DB缓存的session共享 一.应用服务器间

LNMT群集基于Redis实现Session共享

前言:为了使web能适应大规模的访问,需要实现应用的集群部署.集群最有效的方案就是负载均衡,而实现负载均衡用户每一个请求都有可能被分配到不固定的服务器上,这样我们首先要解决session的统一来保证无论用户的请求被转发到哪个服务器上都能保证用户的正常用,也就是需要实现session的共享机制. 在集群系统下实现session统一的有如下几种方案:1.请求精确定位:sessionsticky,例如基于访问ip的hash策略,即当前用户的请求都集中定位到一台服务器中,这样单台服务器保存了用户的ses

项目分布式部署那些事(1):ONS消息队列、基于Redis的Session共享,开源共享

因业务发展需要现在的系统不足以支撑现在的用户量,于是我们在一周之前着手项目的性能优化与分布式部署的相关动作. 概况 现在的系统是基于RabbitHub(一套开源的开发时框架)和Rabbit.WeiXin(开源的微信开发SDK)开发的一款微信应用类系统,主要业务是围绕当下流行的微信元素,如:微官网.微商城.微分销.营销活动.会员卡等. 关于RabbitHub详情请戳: .NET 平台下的插件化开发内核(Rabbit Kernel) RabbitHub开源情况及计划 关于Rabbit.WeiXin详

redis存储session配制方法

redis存储session配制方法需要三个模块: 1.redis 2.express-session 3.connect-redis 项目中的配置方法代码片段如下: 首先连接redis,连接redis数据库: 1 var redis = require('redis'); 2 var redis_client = redis.createClient('6379', redis_host); 3 redis_client.on('error', function (err) { console

.Net分布式架构(二):基于Redis的Session共享

一:Session简介 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台web服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台web服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份.这个SessionID是由web服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子. 二:Asp.Net中Session的集中模式和配置 (1)

基于Redis的在线用户列表解决方案

前言: 由于项目需求,需要在集群环境下实现在线用户列表的功能,并依靠在线列表实现用户单一登陆(同一账户只能一处登陆)功能: 在单机环境下,在线列表的实现方案可以采用SessionListener来完成,当有Session创建和销毁的时候做相应的操作即可完成功能及将相应的Session的引用存放于内存中,由于持有了所有的Session的引用,故可以方便的实现用户单一登陆的功能(比如在第二次登陆的时候使之前登陆的账户所在的Session失效). 而在集群环境下,由于用户的请求可能分布在不同的Web服

[Node.js] Node + Redis 实现分布式Session方案

Session是什么? Session 是面向连接的状态信息,是对 Http 无状态协议的补充. Session 怎么工作? Session 数据保留在服务端,而为了标识具体 Session 信息指向哪个连接,需要客户端传递向服务端发送一个连接标识,比如存在Cookies 中的session_id值(也可以通过URL的QueryString传递),服务端根据这个id 进行存取状态信息. 在服务端存储 Session,可以有很多种方案: 内存存储 数据库存储 分布式缓存存储 分布式Session