blob: 7a2b70382dd22923edbcb1ee5147d9db68100da3 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Anton Lindqvist1e8be292012-01-21 12:25:08 +01002/**
3 * CodeIgniter
4 *
Anton Lindqvist5ccf5ce2012-06-08 11:47:17 +02005 * An open source application development framework for PHP 5.2.4 or newer
Anton Lindqvist1e8be292012-01-21 12:25:08 +01006 *
Anton Lindqvist5a1d9532012-01-23 23:20:26 +01007 * NOTICE OF LICENSE
8 *
9 * Licensed under the Open Software License version 3.0
10 *
11 * This source file is subject to the Open Software License (OSL 3.0) that is
12 * bundled with this package in the files license.txt / license.rst. It is
13 * also available through the world wide web at this URL:
14 * http://opensource.org/licenses/OSL-3.0
15 * If you did not receive a copy of the license and are unable to obtain it
16 * through the world wide web, please send an email to
17 * licensing@ellislab.com so we can send you a copy immediately.
18 *
19 * @package CodeIgniter
20 * @author EllisLab Dev Team
darwinel871754a2014-02-11 17:34:57 +010021 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
Anton Lindqvist5a1d9532012-01-23 23:20:26 +010022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
23 * @link http://codeigniter.com
Andrey Andreev9e674f72012-06-09 21:02:52 +030024 * @since Version 3.0
Anton Lindqvist1e8be292012-01-21 12:25:08 +010025 * @filesource
26 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020027defined('BASEPATH') OR exit('No direct script access allowed');
Anton Lindqvist1e8be292012-01-21 12:25:08 +010028
Anton Lindqvist1e8be292012-01-21 12:25:08 +010029/**
30 * CodeIgniter Redis Caching Class
31 *
32 * @package CodeIgniter
33 * @subpackage Libraries
34 * @category Core
35 * @author Anton Lindqvist <anton@qvister.se>
36 * @link
37 */
38class CI_Cache_redis extends CI_Driver
39{
Anton Lindqvist1e8be292012-01-21 12:25:08 +010040 /**
41 * Default config
42 *
Anton Lindqvist1e8be292012-01-21 12:25:08 +010043 * @static
Andrey Andreev9e674f72012-06-09 21:02:52 +030044 * @var array
Anton Lindqvist1e8be292012-01-21 12:25:08 +010045 */
Anton Lindqvist3573af82012-01-21 20:33:12 +010046 protected static $_default_config = array(
Kakysha80d663a2013-10-28 01:39:17 +040047 'socket_type' => 'tcp',
Anton Lindqvist1e8be292012-01-21 12:25:08 +010048 'host' => '127.0.0.1',
Anton Lindqvist5ccf5ce2012-06-08 11:47:17 +020049 'password' => NULL,
Anton Lindqvist1e8be292012-01-21 12:25:08 +010050 'port' => 6379,
51 'timeout' => 0
52 );
53
54 /**
55 * Redis connection
56 *
Andrey Andreev9e674f72012-06-09 21:02:52 +030057 * @var Redis
Anton Lindqvist1e8be292012-01-21 12:25:08 +010058 */
Anton Lindqvist3573af82012-01-21 20:33:12 +010059 protected $_redis;
Anton Lindqvist1e8be292012-01-21 12:25:08 +010060
Andrey Andreev9e674f72012-06-09 21:02:52 +030061 // ------------------------------------------------------------------------
Anton Lindqvist1e8be292012-01-21 12:25:08 +010062
63 /**
64 * Get cache
65 *
Andrey Andreev43d7fa72014-01-09 17:29:45 +020066 * @param string Cache ID
Andrey Andreev9e674f72012-06-09 21:02:52 +030067 * @return mixed
Anton Lindqvist1e8be292012-01-21 12:25:08 +010068 */
69 public function get($key)
70 {
71 return $this->_redis->get($key);
72 }
73
Andrey Andreev9e674f72012-06-09 21:02:52 +030074 // ------------------------------------------------------------------------
75
Anton Lindqvist1e8be292012-01-21 12:25:08 +010076 /**
77 * Save cache
78 *
Andrey Andreev43d7fa72014-01-09 17:29:45 +020079 * @param string $id Cache ID
80 * @param mixed $data Data to save
81 * @param int $ttl Time to live in seconds
82 * @param bool $raw Whether to store the raw value (unused)
83 * @return bool TRUE on success, FALSE on failure
Anton Lindqvist1e8be292012-01-21 12:25:08 +010084 */
Andrey Andreev43d7fa72014-01-09 17:29:45 +020085 public function save($id, $data, $ttl = 60, $raw = FALSE)
Anton Lindqvist1e8be292012-01-21 12:25:08 +010086 {
87 return ($ttl)
Andrey Andreev43d7fa72014-01-09 17:29:45 +020088 ? $this->_redis->setex($id, $ttl, $data)
89 : $this->_redis->set($id, $data);
Anton Lindqvist1e8be292012-01-21 12:25:08 +010090 }
91
Andrey Andreev9e674f72012-06-09 21:02:52 +030092 // ------------------------------------------------------------------------
93
Anton Lindqvist1e8be292012-01-21 12:25:08 +010094 /**
95 * Delete from cache
96 *
Andrey Andreev9e674f72012-06-09 21:02:52 +030097 * @param string Cache key
98 * @return bool
Anton Lindqvist1e8be292012-01-21 12:25:08 +010099 */
100 public function delete($key)
101 {
102 return ($this->_redis->delete($key) === 1);
103 }
104
Andrey Andreev9e674f72012-06-09 21:02:52 +0300105 // ------------------------------------------------------------------------
106
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100107 /**
Andrey Andreev43d7fa72014-01-09 17:29:45 +0200108 * Increment a raw value
109 *
110 * @param string $id Cache ID
111 * @param int $offset Step/value to add
112 * @return mixed New value on success or FALSE on failure
113 */
114 public function increment($id, $offset = 1)
115 {
Andrey Andreev5f0799a2014-07-31 13:32:41 +0300116 return $this->_redis->incr($id, $offset);
Andrey Andreev43d7fa72014-01-09 17:29:45 +0200117 }
118
119 // ------------------------------------------------------------------------
120
121 /**
122 * Decrement a raw value
123 *
124 * @param string $id Cache ID
125 * @param int $offset Step/value to reduce by
126 * @return mixed New value on success or FALSE on failure
127 */
128 public function decrement($id, $offset = 1)
129 {
Andrey Andreev5f0799a2014-07-31 13:32:41 +0300130 return $this->_redis->decr($id, $offset);
Andrey Andreev43d7fa72014-01-09 17:29:45 +0200131 }
132
133 // ------------------------------------------------------------------------
134
135 /**
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100136 * Clean cache
137 *
Andrey Andreev9e674f72012-06-09 21:02:52 +0300138 * @return bool
139 * @see Redis::flushDB()
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100140 */
141 public function clean()
142 {
143 return $this->_redis->flushDB();
144 }
145
Andrey Andreev9e674f72012-06-09 21:02:52 +0300146 // ------------------------------------------------------------------------
147
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100148 /**
149 * Get cache driver info
150 *
Andrey Andreev9e674f72012-06-09 21:02:52 +0300151 * @param string Not supported in Redis.
152 * Only included in order to offer a
153 * consistent cache API.
154 * @return array
155 * @see Redis::info()
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100156 */
157 public function cache_info($type = NULL)
158 {
159 return $this->_redis->info();
160 }
161
Andrey Andreev9e674f72012-06-09 21:02:52 +0300162 // ------------------------------------------------------------------------
163
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100164 /**
165 * Get cache metadata
166 *
Andrey Andreev9e674f72012-06-09 21:02:52 +0300167 * @param string Cache key
168 * @return array
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100169 */
170 public function get_metadata($key)
171 {
172 $value = $this->get($key);
173
174 if ($value)
Andrey Andreev9e674f72012-06-09 21:02:52 +0300175 {
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100176 return array(
177 'expire' => time() + $this->_redis->ttl($key),
178 'data' => $value
179 );
180 }
Andrey Andreev9e674f72012-06-09 21:02:52 +0300181
182 return FALSE;
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100183 }
184
Andrey Andreev9e674f72012-06-09 21:02:52 +0300185 // ------------------------------------------------------------------------
186
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100187 /**
188 * Check if Redis driver is supported
189 *
Andrey Andreev9e674f72012-06-09 21:02:52 +0300190 * @return bool
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100191 */
192 public function is_supported()
193 {
194 if (extension_loaded('redis'))
Andrey Andreev9e674f72012-06-09 21:02:52 +0300195 {
Kakysha2d146732013-10-28 20:20:24 +0400196 return $this->_setup_redis();
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100197 }
198 else
199 {
Tyler Brownelld967f722013-07-29 19:06:52 -0400200 log_message('debug', 'The Redis extension must be loaded to use Redis cache.');
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100201 return FALSE;
202 }
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100203 }
204
Andrey Andreev9e674f72012-06-09 21:02:52 +0300205 // ------------------------------------------------------------------------
206
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100207 /**
208 * Setup Redis config and connection
209 *
Andrey Andreev9e674f72012-06-09 21:02:52 +0300210 * Loads Redis config file if present. Will halt execution
211 * if a Redis connection can't be established.
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100212 *
Andrey Andreev9e674f72012-06-09 21:02:52 +0300213 * @return bool
214 * @see Redis::connect()
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100215 */
Anton Lindqvist5ccf5ce2012-06-08 11:47:17 +0200216 protected function _setup_redis()
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100217 {
218 $config = array();
219 $CI =& get_instance();
220
221 if ($CI->config->load('redis', TRUE, TRUE))
Anton Lindqvist5ccf5ce2012-06-08 11:47:17 +0200222 {
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100223 $config += $CI->config->item('redis');
224 }
225
226 $config = array_merge(self::$_default_config, $config);
227
228 $this->_redis = new Redis();
229
230 try
231 {
Kakysha80d663a2013-10-28 01:39:17 +0400232 if ($config['socket_type'] === 'unix')
233 {
Kakyshaffe21302013-10-28 21:30:05 +0400234 $success = $this->_redis->connect($config['socket']);
Kakysha8f3f1f92013-10-28 23:14:08 +0400235 }
236 else // tcp socket
Kakysha80d663a2013-10-28 01:39:17 +0400237 {
Kakyshaffe21302013-10-28 21:30:05 +0400238 $success = $this->_redis->connect($config['host'], $config['port'], $config['timeout']);
Kakysha2d146732013-10-28 20:20:24 +0400239 }
Andrey Andreev119d8a72014-01-08 15:27:53 +0200240
Kakyshaffe21302013-10-28 21:30:05 +0400241 if ( ! $success)
Kakysha2d146732013-10-28 20:20:24 +0400242 {
Kakysha333b69b2013-10-29 03:49:56 +0400243 log_message('debug', 'Cache: Redis connection refused. Check the config.');
Kakysha2d146732013-10-28 20:20:24 +0400244 return FALSE;
Kakysha80d663a2013-10-28 01:39:17 +0400245 }
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100246 }
247 catch (RedisException $e)
248 {
Kakysha333b69b2013-10-29 03:49:56 +0400249 log_message('debug', 'Cache: Redis connection refused ('.$e->getMessage().')');
Kakysha2d146732013-10-28 20:20:24 +0400250 return FALSE;
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100251 }
Anton Lindqvist210e6642012-04-23 10:13:46 +0200252
Anton Lindqvist5ccf5ce2012-06-08 11:47:17 +0200253 if (isset($config['password']))
254 {
Anton Lindqvist210e6642012-04-23 10:13:46 +0200255 $this->_redis->auth($config['password']);
256 }
Andrey Andreev119d8a72014-01-08 15:27:53 +0200257
Kakysha2d146732013-10-28 20:20:24 +0400258 return TRUE;
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100259 }
260
Andrey Andreev9e674f72012-06-09 21:02:52 +0300261 // ------------------------------------------------------------------------
262
263 /**
264
265 * Class destructor
266 *
267 * Closes the connection to Redis if present.
268 *
269 * @return void
270 */
271 public function __destruct()
272 {
273 if ($this->_redis)
274 {
275 $this->_redis->close();
276 }
277 }
278
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100279}
Anton Lindqvist1e8be292012-01-21 12:25:08 +0100280
281/* End of file Cache_redis.php */
282/* Location: ./system/libraries/Cache/drivers/Cache_redis.php */