blob: d59847752c0e19d415554278dfcf7497e2f007c0 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Greg Akerbde25d92010-12-21 09:31:21 -06002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Derek Jonesf4a4bd82011-10-20 12:18:42 -05006 *
7 * NOTICE OF LICENSE
Andrey Andreev7d4ea072011-12-25 19:23:50 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreev7d4ea072011-12-25 19:23:50 +020010 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -050011 * 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.
Greg Akerbde25d92010-12-21 09:31:21 -060018 *
19 * @package CodeIgniter
Derek Jonesf4a4bd82011-10-20 12:18:42 -050020 * @author EllisLab Dev Team
Andrey Andreev80500af2013-01-01 08:16:53 +020021 * @copyright Copyright (c) 2008 - 2013, EllisLab, Inc. (http://ellislab.com/)
Derek Jonesf4a4bd82011-10-20 12:18:42 -050022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Greg Akerbde25d92010-12-21 09:31:21 -060023 * @link http://codeigniter.com
24 * @since Version 2.0
Greg Aker151b7a92011-08-21 12:29:43 -050025 * @filesource
Greg Akerbde25d92010-12-21 09:31:21 -060026 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020027defined('BASEPATH') OR exit('No direct script access allowed');
Greg Akerbde25d92010-12-21 09:31:21 -060028
Greg Akerbde25d92010-12-21 09:31:21 -060029/**
Greg Aker151b7a92011-08-21 12:29:43 -050030 * CodeIgniter Memcached Caching Class
Greg Akerbde25d92010-12-21 09:31:21 -060031 *
32 * @package CodeIgniter
33 * @subpackage Libraries
34 * @category Core
Derek Jonesf4a4bd82011-10-20 12:18:42 -050035 * @author EllisLab Dev Team
Greg Aker151b7a92011-08-21 12:29:43 -050036 * @link
Greg Akerbde25d92010-12-21 09:31:21 -060037 */
Phil Sturgeoneb2dcda2011-04-02 14:44:58 +010038class CI_Cache_memcached extends CI_Driver {
Greg Akerbde25d92010-12-21 09:31:21 -060039
Timothy Warren0688ac92012-04-20 10:25:04 -040040 /**
41 * Holds the memcached object
42 *
43 * @var object
44 */
45 protected $_memcached;
Greg Akerbde25d92010-12-21 09:31:21 -060046
Timothy Warren0688ac92012-04-20 10:25:04 -040047 /**
48 * Memcached configuration
49 *
50 * @var array
51 */
Andrey Andreevb24b0332012-03-26 15:34:39 +030052 protected $_memcache_conf = array(
Timothy Warren0688ac92012-04-20 10:25:04 -040053 'default' => array(
Andrey Andreev6a3d7e52013-07-18 19:14:05 +030054 'host' => '127.0.0.1',
55 'port' => 11211,
56 'weight' => 1
Timothy Warren0688ac92012-04-20 10:25:04 -040057 )
58 );
Greg Akerbde25d92010-12-21 09:31:21 -060059
Greg Akerbde25d92010-12-21 09:31:21 -060060 /**
61 * Fetch from cache
62 *
Andrey Andreev43d7fa72014-01-09 17:29:45 +020063 * @param string $id Cache ID
64 * @return mixed Data on success, FALSE on failure
Greg Aker151b7a92011-08-21 12:29:43 -050065 */
Greg Akerbde25d92010-12-21 09:31:21 -060066 public function get($id)
Greg Aker151b7a92011-08-21 12:29:43 -050067 {
Greg Akerbde25d92010-12-21 09:31:21 -060068 $data = $this->_memcached->get($id);
Greg Aker151b7a92011-08-21 12:29:43 -050069
Andrey Andreev43d7fa72014-01-09 17:29:45 +020070 return is_array($data) ? $data[0] : $data;
Greg Akerbde25d92010-12-21 09:31:21 -060071 }
72
73 // ------------------------------------------------------------------------
74
75 /**
76 * Save
77 *
Andrey Andreev43d7fa72014-01-09 17:29:45 +020078 * @param string $id Cache ID
79 * @param mixed $data Data being cached
80 * @param int $ttl Time to live
81 * @param bool $raw Whether to store the raw value
82 * @return bool TRUE on success, FALSE on failure
Greg Akerbde25d92010-12-21 09:31:21 -060083 */
Andrey Andreev43d7fa72014-01-09 17:29:45 +020084 public function save($id, $data, $ttl = 60, $raw = FALSE)
Greg Akerbde25d92010-12-21 09:31:21 -060085 {
Andrey Andreev43d7fa72014-01-09 17:29:45 +020086 if ($raw !== TRUE)
87 {
Andrey Andreevb2a0e702014-01-18 16:54:51 +020088 $data = array($data, time(), $ttl);
Andrey Andreev43d7fa72014-01-09 17:29:45 +020089 }
90
Andrey Andreevb24b0332012-03-26 15:34:39 +030091 if (get_class($this->_memcached) === 'Memcached')
Mark Huotba00e9f2011-09-23 08:20:29 -040092 {
Andrey Andreev43d7fa72014-01-09 17:29:45 +020093 return $this->_memcached->set($id, $data, $ttl);
Mark Huotba00e9f2011-09-23 08:20:29 -040094 }
Andrey Andreevb24b0332012-03-26 15:34:39 +030095 elseif (get_class($this->_memcached) === 'Memcache')
Mark Huotba00e9f2011-09-23 08:20:29 -040096 {
Andrey Andreev43d7fa72014-01-09 17:29:45 +020097 return $this->_memcached->set($id, $data, 0, $ttl);
Mark Huotba00e9f2011-09-23 08:20:29 -040098 }
Andrey Andreev7d4ea072011-12-25 19:23:50 +020099
Mark Huotba00e9f2011-09-23 08:20:29 -0400100 return FALSE;
Greg Akerbde25d92010-12-21 09:31:21 -0600101 }
102
103 // ------------------------------------------------------------------------
Greg Aker151b7a92011-08-21 12:29:43 -0500104
Greg Akerbde25d92010-12-21 09:31:21 -0600105 /**
106 * Delete from Cache
107 *
Andrey Andreevb24b0332012-03-26 15:34:39 +0300108 * @param mixed key to be deleted.
Andrey Andreev56454792012-05-17 14:32:19 +0300109 * @return bool true on success, false on failure
Greg Akerbde25d92010-12-21 09:31:21 -0600110 */
111 public function delete($id)
112 {
113 return $this->_memcached->delete($id);
114 }
115
116 // ------------------------------------------------------------------------
Greg Aker151b7a92011-08-21 12:29:43 -0500117
Greg Akerbde25d92010-12-21 09:31:21 -0600118 /**
Andrey Andreev43d7fa72014-01-09 17:29:45 +0200119 * Increment a raw value
120 *
121 * @param string $id Cache ID
122 * @param int $offset Step/value to add
123 * @return mixed New value on success or FALSE on failure
124 */
125 public function increment($id, $offset = 1)
126 {
127 return $this->_memcached->increment($id, $offset);
128 }
129
130 // ------------------------------------------------------------------------
131
132 /**
133 * Decrement a raw value
134 *
135 * @param string $id Cache ID
136 * @param int $offset Step/value to reduce by
137 * @return mixed New value on success or FALSE on failure
138 */
139 public function decrement($id, $offset = 1)
140 {
141 return $this->_memcached->decrement($id, $offset);
142 }
143
144 // ------------------------------------------------------------------------
145
146 /**
Greg Akerbde25d92010-12-21 09:31:21 -0600147 * Clean the Cache
148 *
Andrey Andreevb24b0332012-03-26 15:34:39 +0300149 * @return bool false on failure/true on success
Greg Akerbde25d92010-12-21 09:31:21 -0600150 */
151 public function clean()
152 {
153 return $this->_memcached->flush();
154 }
155
156 // ------------------------------------------------------------------------
157
158 /**
159 * Cache Info
160 *
Andrey Andreevb24b0332012-03-26 15:34:39 +0300161 * @return mixed array on success, false on failure
Greg Akerbde25d92010-12-21 09:31:21 -0600162 */
Andrey Andreevb24b0332012-03-26 15:34:39 +0300163 public function cache_info()
Greg Akerbde25d92010-12-21 09:31:21 -0600164 {
165 return $this->_memcached->getStats();
166 }
167
168 // ------------------------------------------------------------------------
Greg Aker151b7a92011-08-21 12:29:43 -0500169
Greg Akerbde25d92010-12-21 09:31:21 -0600170 /**
171 * Get Cache Metadata
172 *
Andrey Andreevb24b0332012-03-26 15:34:39 +0300173 * @param mixed key to get cache metadata on
174 * @return mixed FALSE on failure, array on success.
Greg Akerbde25d92010-12-21 09:31:21 -0600175 */
176 public function get_metadata($id)
177 {
178 $stored = $this->_memcached->get($id);
179
180 if (count($stored) !== 3)
181 {
182 return FALSE;
183 }
184
Greg Aker999e7472011-01-29 16:16:58 -0600185 list($data, $time, $ttl) = $stored;
Greg Akerbde25d92010-12-21 09:31:21 -0600186
187 return array(
188 'expire' => $time + $ttl,
189 'mtime' => $time,
190 'data' => $data
191 );
192 }
193
194 // ------------------------------------------------------------------------
195
196 /**
197 * Setup memcached.
Andrey Andreevb24b0332012-03-26 15:34:39 +0300198 *
199 * @return bool
Greg Akerbde25d92010-12-21 09:31:21 -0600200 */
Andrey Andreevb24b0332012-03-26 15:34:39 +0300201 protected function _setup_memcached()
Greg Akerbde25d92010-12-21 09:31:21 -0600202 {
203 // Try to load memcached server info from the config file.
204 $CI =& get_instance();
Greg Aker151b7a92011-08-21 12:29:43 -0500205
Greg Akerbde25d92010-12-21 09:31:21 -0600206 if ($CI->config->load('memcached', TRUE, TRUE))
207 {
208 if (is_array($CI->config->config['memcached']))
209 {
Andrey Andreev6a3d7e52013-07-18 19:14:05 +0300210 $defaults = $this->_memcache_conf['default'];
211 $this->_memcache_conf = array();
Greg Akerbde25d92010-12-21 09:31:21 -0600212
213 foreach ($CI->config->config['memcached'] as $name => $conf)
214 {
215 $this->_memcache_conf[$name] = $conf;
Greg Aker151b7a92011-08-21 12:29:43 -0500216 }
217 }
Greg Akerbde25d92010-12-21 09:31:21 -0600218 }
John Bellonecbb81c62011-08-21 09:12:33 -0400219
Andrey Andreev49e68de2013-02-21 16:30:55 +0200220 if (class_exists('Memcached', FALSE))
Greg Aker151b7a92011-08-21 12:29:43 -0500221 {
222 $this->_memcached = new Memcached();
223 }
Andrey Andreev49e68de2013-02-21 16:30:55 +0200224 elseif (class_exists('Memcache', FALSE))
Greg Aker151b7a92011-08-21 12:29:43 -0500225 {
226 $this->_memcached = new Memcache();
227 }
228 else
229 {
230 log_message('error', 'Failed to create object for Memcached Cache; extension not loaded?');
Greg Aker151b7a92011-08-21 12:29:43 -0500231 return FALSE;
232 }
Greg Akerbde25d92010-12-21 09:31:21 -0600233
ThallisPHP08ddfb82013-05-20 11:10:26 -0300234 foreach ($this->_memcache_conf as $cache_server)
Greg Akerbde25d92010-12-21 09:31:21 -0600235 {
Andrey Andreev6a3d7e52013-07-18 19:14:05 +0300236 isset($cache_server['hostname']) OR $cache_server['hostname'] = $defaults['host'];
237 isset($cache_server['port']) OR $cache_server['port'] = $defaults['host'];
238 isset($cache_server['weight']) OR $cache_server['weight'] = $defaults['weight'];
Greg Aker151b7a92011-08-21 12:29:43 -0500239
Alex Bilbied261b1e2012-06-02 11:12:16 +0100240 if (get_class($this->_memcached) === 'Memcache')
Greg Aker151b7a92011-08-21 12:29:43 -0500241 {
242 // Third parameter is persistance and defaults to TRUE.
243 $this->_memcached->addServer(
244 $cache_server['hostname'],
245 $cache_server['port'],
246 TRUE,
247 $cache_server['weight']
248 );
249 }
250 else
251 {
252 $this->_memcached->addServer(
253 $cache_server['hostname'],
254 $cache_server['port'],
255 $cache_server['weight']
256 );
257 }
Greg Akerbde25d92010-12-21 09:31:21 -0600258 }
John Bellone51758fc2011-08-21 09:38:44 -0400259
Greg Aker151b7a92011-08-21 12:29:43 -0500260 return TRUE;
Greg Akerbde25d92010-12-21 09:31:21 -0600261 }
262
263 // ------------------------------------------------------------------------
264
Greg Akerbde25d92010-12-21 09:31:21 -0600265 /**
266 * Is supported
267 *
268 * Returns FALSE if memcached is not supported on the system.
269 * If it is, we setup the memcached object & return TRUE
Andrey Andreevb24b0332012-03-26 15:34:39 +0300270 *
271 * @return bool
Greg Akerbde25d92010-12-21 09:31:21 -0600272 */
273 public function is_supported()
274 {
Greg Aker151b7a92011-08-21 12:29:43 -0500275 if ( ! extension_loaded('memcached') && ! extension_loaded('memcache'))
Greg Akerbde25d92010-12-21 09:31:21 -0600276 {
Tyler Brownelld967f722013-07-29 19:06:52 -0400277 log_message('debug', 'The Memcached Extension must be loaded to use Memcached Cache.');
Greg Akerbde25d92010-12-21 09:31:21 -0600278 return FALSE;
279 }
John Bellone02d73692011-08-21 09:32:35 -0400280
281 return $this->_setup_memcached();
Greg Akerbde25d92010-12-21 09:31:21 -0600282 }
283
Greg Akerbde25d92010-12-21 09:31:21 -0600284}
Greg Akerbde25d92010-12-21 09:31:21 -0600285
286/* End of file Cache_memcached.php */
Andrey Andreev2ecc06c2013-07-17 12:31:11 +0300287/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */