Mercurial > hg > rc2
comparison program/lib/Roundcube/rcube_session_redis.php @ 0:4681f974d28b
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:52:31 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4681f974d28b |
---|---|
1 <?php | |
2 | |
3 /** | |
4 +-----------------------------------------------------------------------+ | |
5 | This file is part of the Roundcube Webmail client | | |
6 | Copyright (C) 2005-2014, The Roundcube Dev Team | | |
7 | | | |
8 | Licensed under the GNU General Public License version 3 or | | |
9 | any later version with exceptions for skins & plugins. | | |
10 | See the README file for a full license statement. | | |
11 | | | |
12 | PURPOSE: | | |
13 | Provide redis supported session management | | |
14 +-----------------------------------------------------------------------+ | |
15 | Author: Cor Bosman <cor@roundcu.be> | | |
16 +-----------------------------------------------------------------------+ | |
17 */ | |
18 | |
19 /** | |
20 * Class to provide redis session storage | |
21 * | |
22 * @package Framework | |
23 * @subpackage Core | |
24 * @author Cor Bosman <cor@roundcu.be> | |
25 */ | |
26 class rcube_session_redis extends rcube_session { | |
27 | |
28 private $redis; | |
29 | |
30 /** | |
31 * @param Object $config | |
32 */ | |
33 public function __construct($config) | |
34 { | |
35 parent::__construct($config); | |
36 | |
37 // instantiate Redis object | |
38 $this->redis = new Redis(); | |
39 | |
40 if (!$this->redis) { | |
41 rcube::raise_error(array('code' => 604, 'type' => 'session', | |
42 'line' => __LINE__, 'file' => __FILE__, | |
43 'message' => "Failed to find Redis. Make sure php-redis is included"), | |
44 true, true); | |
45 } | |
46 | |
47 // get config instance | |
48 $hosts = $this->config->get('redis_hosts', array('localhost')); | |
49 | |
50 // host config is wrong | |
51 if (!is_array($hosts) || empty($hosts)) { | |
52 rcube::raise_error(array('code' => 604, 'type' => 'session', | |
53 'line' => __LINE__, 'file' => __FILE__, | |
54 'message' => "Redis host not configured"), | |
55 true, true); | |
56 } | |
57 | |
58 // only allow 1 host for now until we support clustering | |
59 if (count($hosts) > 1) { | |
60 rcube::raise_error(array('code' => 604, 'type' => 'session', | |
61 'line' => __LINE__, 'file' => __FILE__, | |
62 'message' => "Redis cluster not yet supported"), | |
63 true, true); | |
64 } | |
65 | |
66 foreach ($hosts as $host) { | |
67 // explode individual fields | |
68 list($host, $port, $database, $password) = array_pad(explode(':', $host, 4), 4, null); | |
69 | |
70 // set default values if not set | |
71 $host = ($host !== null) ? $host : '127.0.0.1'; | |
72 $port = ($port !== null) ? $port : 6379; | |
73 $database = ($database !== null) ? $database : 0; | |
74 | |
75 if ($this->redis->connect($host, $port) === false) { | |
76 rcube::raise_error( | |
77 array( | |
78 'code' => 604, | |
79 'type' => 'session', | |
80 'line' => __LINE__, | |
81 'file' => __FILE__, | |
82 'message' => "Could not connect to Redis server. Please check host and port" | |
83 ), | |
84 true, | |
85 true | |
86 ); | |
87 } | |
88 | |
89 if ($password != null && $this->redis->auth($password) === false) { | |
90 rcube::raise_error( | |
91 array( | |
92 'code' => 604, | |
93 'type' => 'session', | |
94 'line' => __LINE__, | |
95 'file' => __FILE__, | |
96 'message' => "Could not authenticate with Redis server. Please check password." | |
97 ), | |
98 true, | |
99 true | |
100 ); | |
101 } | |
102 | |
103 if ($database != 0 && $this->redis->select($database) === false) { | |
104 rcube::raise_error( | |
105 array( | |
106 'code' => 604, | |
107 'type' => 'session', | |
108 'line' => __LINE__, | |
109 'file' => __FILE__, | |
110 'message' => "Could not select Redis database. Please check database setting." | |
111 ), | |
112 true, | |
113 true | |
114 ); | |
115 } | |
116 } | |
117 | |
118 // register sessions handler | |
119 $this->register_session_handler(); | |
120 } | |
121 | |
122 /** | |
123 * @param $save_path | |
124 * @param $session_name | |
125 * @return bool | |
126 */ | |
127 public function open($save_path, $session_name) | |
128 { | |
129 return true; | |
130 } | |
131 | |
132 /** | |
133 * @return bool | |
134 */ | |
135 public function close() | |
136 { | |
137 return true; | |
138 } | |
139 | |
140 /** | |
141 * remove data from store | |
142 * | |
143 * @param $key | |
144 * @return bool | |
145 */ | |
146 public function destroy($key) | |
147 { | |
148 if ($key) { | |
149 $this->redis->del($key); | |
150 } | |
151 | |
152 return true; | |
153 } | |
154 | |
155 /** | |
156 * read data from redis store | |
157 * | |
158 * @param $key | |
159 * @return null | |
160 */ | |
161 public function read($key) | |
162 { | |
163 if ($value = $this->redis->get($key)) { | |
164 $arr = unserialize($value); | |
165 $this->changed = $arr['changed']; | |
166 $this->ip = $arr['ip']; | |
167 $this->vars = $arr['vars']; | |
168 $this->key = $key; | |
169 | |
170 return !empty($this->vars) ? (string) $this->vars : ''; | |
171 } | |
172 | |
173 return ''; | |
174 } | |
175 | |
176 /** | |
177 * write data to redis store | |
178 * | |
179 * @param $key | |
180 * @param $newvars | |
181 * @param $oldvars | |
182 * @return bool | |
183 */ | |
184 public function update($key, $newvars, $oldvars) | |
185 { | |
186 $ts = microtime(true); | |
187 | |
188 if ($newvars !== $oldvars || $ts - $this->changed > $this->lifetime / 3) { | |
189 $data = serialize(array('changed' => time(), 'ip' => $this->ip, 'vars' => $newvars)); | |
190 $this->redis->setex($key, $this->lifetime + 60, $data); | |
191 } | |
192 | |
193 return true; | |
194 } | |
195 | |
196 /** | |
197 * write data to redis store | |
198 * | |
199 * @param $key | |
200 * @param $vars | |
201 * @return bool | |
202 */ | |
203 public function write($key, $vars) | |
204 { | |
205 $data = serialize(array('changed' => time(), 'ip' => $this->ip, 'vars' => $vars)); | |
206 | |
207 return $this->redis->setex($key, $this->lifetime + 60, $data); | |
208 } | |
209 } |