blob: 03174bda113f14de00f47ca44f5fece28f14e6a4 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Greg Akerbde25d92010-12-21 09:31:21 -06002/**
3 * CodeIgniter
4 *
Andrey Andreevfe9309d2015-01-09 17:48:58 +02005 * An open source application development framework for PHP
Derek Jonesf4a4bd82011-10-20 12:18:42 -05006 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +02007 * This content is released under the MIT License (MIT)
Andrey Andreev7d4ea072011-12-25 19:23:50 +02008 *
Andrey Andreevfe9309d2015-01-09 17:48:58 +02009 * Copyright (c) 2014 - 2015, British Columbia Institute of Technology
Andrey Andreev7d4ea072011-12-25 19:23:50 +020010 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020011 * Permission is hereby granted, free of charge, to any person obtaining a copy
12 * of this software and associated documentation files (the "Software"), to deal
13 * in the Software without restriction, including without limitation the rights
14 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 * copies of the Software, and to permit persons to whom the Software is
16 * furnished to do so, subject to the following conditions:
Greg Akerbde25d92010-12-21 09:31:21 -060017 *
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020018 * The above copyright notice and this permission notice shall be included in
19 * all copies or substantial portions of the Software.
20 *
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27 * THE SOFTWARE.
28 *
29 * @package CodeIgniter
30 * @author EllisLab Dev Team
darwinel871754a2014-02-11 17:34:57 +010031 * @copyright Copyright (c) 2008 - 2014, EllisLab, Inc. (http://ellislab.com/)
Andrey Andreevfe9309d2015-01-09 17:48:58 +020032 * @copyright Copyright (c) 2014 - 2015, British Columbia Institute of Technology (http://bcit.ca/)
Andrey Andreevbdb96ca2014-10-28 00:13:31 +020033 * @license http://opensource.org/licenses/MIT MIT License
34 * @link http://codeigniter.com
35 * @since Version 2.0
Greg Aker151b7a92011-08-21 12:29:43 -050036 * @filesource
Greg Akerbde25d92010-12-21 09:31:21 -060037 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020038defined('BASEPATH') OR exit('No direct script access allowed');
Greg Akerbde25d92010-12-21 09:31:21 -060039
Greg Akerbde25d92010-12-21 09:31:21 -060040/**
Greg Aker151b7a92011-08-21 12:29:43 -050041 * CodeIgniter Memcached Caching Class
Greg Akerbde25d92010-12-21 09:31:21 -060042 *
43 * @package CodeIgniter
44 * @subpackage Libraries
45 * @category Core
Derek Jonesf4a4bd82011-10-20 12:18:42 -050046 * @author EllisLab Dev Team
Greg Aker151b7a92011-08-21 12:29:43 -050047 * @link
Greg Akerbde25d92010-12-21 09:31:21 -060048 */
Phil Sturgeoneb2dcda2011-04-02 14:44:58 +010049class CI_Cache_memcached extends CI_Driver {
Greg Akerbde25d92010-12-21 09:31:21 -060050
Timothy Warren0688ac92012-04-20 10:25:04 -040051 /**
52 * Holds the memcached object
53 *
54 * @var object
55 */
56 protected $_memcached;
Greg Akerbde25d92010-12-21 09:31:21 -060057
Timothy Warren0688ac92012-04-20 10:25:04 -040058 /**
59 * Memcached configuration
60 *
61 * @var array
62 */
Andrey Andreev25df7a92014-07-31 13:42:07 +030063 protected $_memcache_conf = array(
Timothy Warren0688ac92012-04-20 10:25:04 -040064 'default' => array(
Andrey Andreev6a3d7e52013-07-18 19:14:05 +030065 'host' => '127.0.0.1',
66 'port' => 11211,
67 'weight' => 1
Timothy Warren0688ac92012-04-20 10:25:04 -040068 )
69 );
Greg Akerbde25d92010-12-21 09:31:21 -060070
Greg Akerbde25d92010-12-21 09:31:21 -060071 /**
72 * Fetch from cache
73 *
Andrey Andreev43d7fa72014-01-09 17:29:45 +020074 * @param string $id Cache ID
75 * @return mixed Data on success, FALSE on failure
Greg Aker151b7a92011-08-21 12:29:43 -050076 */
Greg Akerbde25d92010-12-21 09:31:21 -060077 public function get($id)
Greg Aker151b7a92011-08-21 12:29:43 -050078 {
Greg Akerbde25d92010-12-21 09:31:21 -060079 $data = $this->_memcached->get($id);
Greg Aker151b7a92011-08-21 12:29:43 -050080
Andrey Andreev43d7fa72014-01-09 17:29:45 +020081 return is_array($data) ? $data[0] : $data;
Greg Akerbde25d92010-12-21 09:31:21 -060082 }
83
84 // ------------------------------------------------------------------------
85
86 /**
87 * Save
88 *
Andrey Andreev43d7fa72014-01-09 17:29:45 +020089 * @param string $id Cache ID
90 * @param mixed $data Data being cached
91 * @param int $ttl Time to live
92 * @param bool $raw Whether to store the raw value
93 * @return bool TRUE on success, FALSE on failure
Greg Akerbde25d92010-12-21 09:31:21 -060094 */
Andrey Andreev43d7fa72014-01-09 17:29:45 +020095 public function save($id, $data, $ttl = 60, $raw = FALSE)
Greg Akerbde25d92010-12-21 09:31:21 -060096 {
Andrey Andreev43d7fa72014-01-09 17:29:45 +020097 if ($raw !== TRUE)
98 {
Andrey Andreevb2a0e702014-01-18 16:54:51 +020099 $data = array($data, time(), $ttl);
Andrey Andreev43d7fa72014-01-09 17:29:45 +0200100 }
101
Andrey Andreevb24b0332012-03-26 15:34:39 +0300102 if (get_class($this->_memcached) === 'Memcached')
Mark Huotba00e9f2011-09-23 08:20:29 -0400103 {
Andrey Andreev43d7fa72014-01-09 17:29:45 +0200104 return $this->_memcached->set($id, $data, $ttl);
Mark Huotba00e9f2011-09-23 08:20:29 -0400105 }
Andrey Andreevb24b0332012-03-26 15:34:39 +0300106 elseif (get_class($this->_memcached) === 'Memcache')
Mark Huotba00e9f2011-09-23 08:20:29 -0400107 {
Andrey Andreev43d7fa72014-01-09 17:29:45 +0200108 return $this->_memcached->set($id, $data, 0, $ttl);
Mark Huotba00e9f2011-09-23 08:20:29 -0400109 }
Andrey Andreev7d4ea072011-12-25 19:23:50 +0200110
Mark Huotba00e9f2011-09-23 08:20:29 -0400111 return FALSE;
Greg Akerbde25d92010-12-21 09:31:21 -0600112 }
113
114 // ------------------------------------------------------------------------
Greg Aker151b7a92011-08-21 12:29:43 -0500115
Greg Akerbde25d92010-12-21 09:31:21 -0600116 /**
117 * Delete from Cache
118 *
Andrey Andreevb24b0332012-03-26 15:34:39 +0300119 * @param mixed key to be deleted.
Andrey Andreev56454792012-05-17 14:32:19 +0300120 * @return bool true on success, false on failure
Greg Akerbde25d92010-12-21 09:31:21 -0600121 */
122 public function delete($id)
123 {
124 return $this->_memcached->delete($id);
125 }
126
127 // ------------------------------------------------------------------------
Greg Aker151b7a92011-08-21 12:29:43 -0500128
Greg Akerbde25d92010-12-21 09:31:21 -0600129 /**
Andrey Andreev43d7fa72014-01-09 17:29:45 +0200130 * Increment a raw value
131 *
132 * @param string $id Cache ID
133 * @param int $offset Step/value to add
134 * @return mixed New value on success or FALSE on failure
135 */
136 public function increment($id, $offset = 1)
137 {
138 return $this->_memcached->increment($id, $offset);
139 }
140
141 // ------------------------------------------------------------------------
142
143 /**
144 * Decrement a raw value
145 *
146 * @param string $id Cache ID
147 * @param int $offset Step/value to reduce by
148 * @return mixed New value on success or FALSE on failure
149 */
150 public function decrement($id, $offset = 1)
151 {
152 return $this->_memcached->decrement($id, $offset);
153 }
154
155 // ------------------------------------------------------------------------
156
157 /**
Greg Akerbde25d92010-12-21 09:31:21 -0600158 * Clean the Cache
159 *
Andrey Andreevb24b0332012-03-26 15:34:39 +0300160 * @return bool false on failure/true on success
Greg Akerbde25d92010-12-21 09:31:21 -0600161 */
162 public function clean()
163 {
164 return $this->_memcached->flush();
165 }
166
167 // ------------------------------------------------------------------------
168
169 /**
170 * Cache Info
171 *
Andrey Andreevb24b0332012-03-26 15:34:39 +0300172 * @return mixed array on success, false on failure
Greg Akerbde25d92010-12-21 09:31:21 -0600173 */
Andrey Andreevb24b0332012-03-26 15:34:39 +0300174 public function cache_info()
Greg Akerbde25d92010-12-21 09:31:21 -0600175 {
176 return $this->_memcached->getStats();
177 }
178
179 // ------------------------------------------------------------------------
Greg Aker151b7a92011-08-21 12:29:43 -0500180
Greg Akerbde25d92010-12-21 09:31:21 -0600181 /**
182 * Get Cache Metadata
183 *
Andrey Andreevb24b0332012-03-26 15:34:39 +0300184 * @param mixed key to get cache metadata on
185 * @return mixed FALSE on failure, array on success.
Greg Akerbde25d92010-12-21 09:31:21 -0600186 */
187 public function get_metadata($id)
188 {
189 $stored = $this->_memcached->get($id);
190
191 if (count($stored) !== 3)
192 {
193 return FALSE;
194 }
195
Greg Aker999e7472011-01-29 16:16:58 -0600196 list($data, $time, $ttl) = $stored;
Greg Akerbde25d92010-12-21 09:31:21 -0600197
198 return array(
199 'expire' => $time + $ttl,
200 'mtime' => $time,
201 'data' => $data
202 );
203 }
204
205 // ------------------------------------------------------------------------
206
207 /**
208 * Setup memcached.
Andrey Andreevb24b0332012-03-26 15:34:39 +0300209 *
210 * @return bool
Greg Akerbde25d92010-12-21 09:31:21 -0600211 */
Andrey Andreevb24b0332012-03-26 15:34:39 +0300212 protected function _setup_memcached()
Greg Akerbde25d92010-12-21 09:31:21 -0600213 {
214 // Try to load memcached server info from the config file.
215 $CI =& get_instance();
Andrey Andreev25df7a92014-07-31 13:42:07 +0300216 $defaults = $this->_memcache_conf['default'];
Greg Aker151b7a92011-08-21 12:29:43 -0500217
Greg Akerbde25d92010-12-21 09:31:21 -0600218 if ($CI->config->load('memcached', TRUE, TRUE))
219 {
220 if (is_array($CI->config->config['memcached']))
221 {
Andrey Andreev6a3d7e52013-07-18 19:14:05 +0300222 $this->_memcache_conf = array();
Greg Akerbde25d92010-12-21 09:31:21 -0600223
224 foreach ($CI->config->config['memcached'] as $name => $conf)
225 {
226 $this->_memcache_conf[$name] = $conf;
Greg Aker151b7a92011-08-21 12:29:43 -0500227 }
228 }
Greg Akerbde25d92010-12-21 09:31:21 -0600229 }
John Bellonecbb81c62011-08-21 09:12:33 -0400230
Andrey Andreev49e68de2013-02-21 16:30:55 +0200231 if (class_exists('Memcached', FALSE))
Greg Aker151b7a92011-08-21 12:29:43 -0500232 {
233 $this->_memcached = new Memcached();
234 }
Andrey Andreev49e68de2013-02-21 16:30:55 +0200235 elseif (class_exists('Memcache', FALSE))
Greg Aker151b7a92011-08-21 12:29:43 -0500236 {
237 $this->_memcached = new Memcache();
238 }
239 else
240 {
241 log_message('error', 'Failed to create object for Memcached Cache; extension not loaded?');
Greg Aker151b7a92011-08-21 12:29:43 -0500242 return FALSE;
243 }
Greg Akerbde25d92010-12-21 09:31:21 -0600244
ThallisPHP08ddfb82013-05-20 11:10:26 -0300245 foreach ($this->_memcache_conf as $cache_server)
Greg Akerbde25d92010-12-21 09:31:21 -0600246 {
Andrey Andreev6a3d7e52013-07-18 19:14:05 +0300247 isset($cache_server['hostname']) OR $cache_server['hostname'] = $defaults['host'];
Andrey Andreev21f2e062015-01-04 19:30:31 +0200248 isset($cache_server['port']) OR $cache_server['port'] = $defaults['port'];
Andrey Andreev6a3d7e52013-07-18 19:14:05 +0300249 isset($cache_server['weight']) OR $cache_server['weight'] = $defaults['weight'];
Greg Aker151b7a92011-08-21 12:29:43 -0500250
Alex Bilbied261b1e2012-06-02 11:12:16 +0100251 if (get_class($this->_memcached) === 'Memcache')
Greg Aker151b7a92011-08-21 12:29:43 -0500252 {
253 // Third parameter is persistance and defaults to TRUE.
254 $this->_memcached->addServer(
255 $cache_server['hostname'],
256 $cache_server['port'],
257 TRUE,
258 $cache_server['weight']
259 );
260 }
261 else
262 {
263 $this->_memcached->addServer(
264 $cache_server['hostname'],
265 $cache_server['port'],
266 $cache_server['weight']
267 );
268 }
Greg Akerbde25d92010-12-21 09:31:21 -0600269 }
John Bellone51758fc2011-08-21 09:38:44 -0400270
Greg Aker151b7a92011-08-21 12:29:43 -0500271 return TRUE;
Greg Akerbde25d92010-12-21 09:31:21 -0600272 }
273
274 // ------------------------------------------------------------------------
275
Greg Akerbde25d92010-12-21 09:31:21 -0600276 /**
277 * Is supported
278 *
279 * Returns FALSE if memcached is not supported on the system.
280 * If it is, we setup the memcached object & return TRUE
Andrey Andreevb24b0332012-03-26 15:34:39 +0300281 *
282 * @return bool
Greg Akerbde25d92010-12-21 09:31:21 -0600283 */
284 public function is_supported()
285 {
Greg Aker151b7a92011-08-21 12:29:43 -0500286 if ( ! extension_loaded('memcached') && ! extension_loaded('memcache'))
Greg Akerbde25d92010-12-21 09:31:21 -0600287 {
Tyler Brownelld967f722013-07-29 19:06:52 -0400288 log_message('debug', 'The Memcached Extension must be loaded to use Memcached Cache.');
Greg Akerbde25d92010-12-21 09:31:21 -0600289 return FALSE;
290 }
John Bellone02d73692011-08-21 09:32:35 -0400291
292 return $this->_setup_memcached();
Greg Akerbde25d92010-12-21 09:31:21 -0600293 }
294
Greg Akerbde25d92010-12-21 09:31:21 -0600295}
Greg Akerbde25d92010-12-21 09:31:21 -0600296
297/* End of file Cache_memcached.php */
Andrey Andreev2ecc06c2013-07-17 12:31:11 +0300298/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */