基于redis的处理session的方法

Posted 猿客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于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函数。

以上是关于基于redis的处理session的方法的主要内容,如果未能解决你的问题,请参考以下文章

php Session存储到Redis的方法

LNMT群集基于Redis实现Session共享

如何配置php session使用redis集群

基于redis解决session共享问题

ASP.NET下跨应用共享Session和使用Redis进行Session托管

LNMT群集基于Redis实现Session共享