blob: b9593b7341d58a1c0db6d4ca4d03fbe274779792 [file] [log] [blame]
Greg Akerbde25d92010-12-21 09:31:21 -06001<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2/**
3 * CodeIgniter
4 *
5 * An open source application development framework for PHP 4.3.2 or newer
6 *
7 * @package CodeIgniter
8 * @author ExpressionEngine Dev Team
Derek Jones700205a2011-01-28 07:44:28 -06009 * @copyright Copyright (c) 2006 - 2011 EllisLab, Inc.
Greg Akerbde25d92010-12-21 09:31:21 -060010 * @license http://codeigniter.com/user_guide/license.html
11 * @link http://codeigniter.com
12 * @since Version 2.0
13 * @filesource
14 */
15
16// ------------------------------------------------------------------------
17
18/**
19 * CodeIgniter Memcached Caching Class
20 *
21 * @package CodeIgniter
22 * @subpackage Libraries
23 * @category Core
24 * @author ExpressionEngine Dev Team
25 * @link
26 */
27
Phil Sturgeoneb2dcda2011-04-02 14:44:58 +010028class CI_Cache_memcached extends CI_Driver {
Greg Akerbde25d92010-12-21 09:31:21 -060029
30 private $_memcached; // Holds the memcached object
31
32 protected $_memcache_conf = array(
33 'default' => array(
34 'default_host' => '127.0.0.1',
35 'default_port' => 11211,
36 'default_weight' => 1
37 )
38 );
39
40 // ------------------------------------------------------------------------
41
42 /**
43 * Fetch from cache
44 *
45 * @param mixed unique key id
46 * @return mixed data on success/false on failure
47 */
48 public function get($id)
49 {
50 $data = $this->_memcached->get($id);
51
52 return (is_array($data)) ? $data[0] : FALSE;
53 }
54
55 // ------------------------------------------------------------------------
56
57 /**
58 * Save
59 *
60 * @param string unique identifier
61 * @param mixed data being cached
62 * @param int time to live
63 * @return boolean true on success, false on failure
64 */
65 public function save($id, $data, $ttl = 60)
66 {
67 return $this->_memcached->add($id, array($data, time(), $ttl), $ttl);
68 }
69
70 // ------------------------------------------------------------------------
71
72 /**
73 * Delete from Cache
74 *
75 * @param mixed key to be deleted.
76 * @return boolean true on success, false on failure
77 */
78 public function delete($id)
79 {
80 return $this->_memcached->delete($id);
81 }
82
83 // ------------------------------------------------------------------------
84
85 /**
86 * Clean the Cache
87 *
88 * @return boolean false on failure/true on success
89 */
90 public function clean()
91 {
92 return $this->_memcached->flush();
93 }
94
95 // ------------------------------------------------------------------------
96
97 /**
98 * Cache Info
99 *
100 * @param null type not supported in memcached
101 * @return mixed array on success, false on failure
102 */
103 public function cache_info($type = NULL)
104 {
105 return $this->_memcached->getStats();
106 }
107
108 // ------------------------------------------------------------------------
109
110 /**
111 * Get Cache Metadata
112 *
113 * @param mixed key to get cache metadata on
114 * @return mixed FALSE on failure, array on success.
115 */
116 public function get_metadata($id)
117 {
118 $stored = $this->_memcached->get($id);
119
120 if (count($stored) !== 3)
121 {
122 return FALSE;
123 }
124
Greg Aker999e7472011-01-29 16:16:58 -0600125 list($data, $time, $ttl) = $stored;
Greg Akerbde25d92010-12-21 09:31:21 -0600126
127 return array(
128 'expire' => $time + $ttl,
129 'mtime' => $time,
130 'data' => $data
131 );
132 }
133
134 // ------------------------------------------------------------------------
135
136 /**
137 * Setup memcached.
138 */
139 private function _setup_memcached()
140 {
141 // Try to load memcached server info from the config file.
142 $CI =& get_instance();
143 if ($CI->config->load('memcached', TRUE, TRUE))
144 {
145 if (is_array($CI->config->config['memcached']))
146 {
147 $this->_memcache_conf = NULL;
148
149 foreach ($CI->config->config['memcached'] as $name => $conf)
150 {
151 $this->_memcache_conf[$name] = $conf;
152 }
153 }
154 }
John Bellonecbb81c62011-08-21 09:12:33 -0400155
John Bellone090bdf62011-08-21 12:42:03 -0400156 if (class_exists('Memcached'))
157 {
John Bellone9e8dc0e2011-08-21 08:54:56 -0400158 $this->_memcached = new Memcached();
159 }
John Bellone090bdf62011-08-21 12:42:03 -0400160 else if (class_exists('Memcache'))
161 {
John Bellone9e8dc0e2011-08-21 08:54:56 -0400162 $this->_memcached = new Memcache();
163 }
John Bellone090bdf62011-08-21 12:42:03 -0400164 else
165 {
John Bellonecbb81c62011-08-21 09:12:33 -0400166 log_message('error', 'Failed to create object for Memcached Cache; extension not loaded?');
John Bellone9e8dc0e2011-08-21 08:54:56 -0400167
John Bellonecbb81c62011-08-21 09:12:33 -0400168 return FALSE;
John Bellone9e8dc0e2011-08-21 08:54:56 -0400169 }
Greg Akerbde25d92010-12-21 09:31:21 -0600170
171 foreach ($this->_memcache_conf as $name => $cache_server)
172 {
173 if ( ! array_key_exists('hostname', $cache_server))
174 {
175 $cache_server['hostname'] = $this->_default_options['default_host'];
176 }
177
178 if ( ! array_key_exists('port', $cache_server))
179 {
180 $cache_server['port'] = $this->_default_options['default_port'];
181 }
182
183 if ( ! array_key_exists('weight', $cache_server))
184 {
185 $cache_server['weight'] = $this->_default_options['default_weight'];
186 }
187
John Bellone090bdf62011-08-21 12:42:03 -0400188 if (get_class($this->_memcached) == 'Memcache')
189 {
John Bellone0ad834c2011-08-21 09:29:39 -0400190 // Third parameter is persistance and defaults to TRUE.
191 $this->_memcached->addServer(
John Bellone51e4bca2011-08-21 12:43:21 -0400192 $cache_server['hostname'],
John Bellone0ad834c2011-08-21 09:29:39 -0400193 $cache_server['port'],
194 TRUE,
195 $cache_server['weight']
196 );
197 }
John Bellone090bdf62011-08-21 12:42:03 -0400198 else
199 {
John Bellone0ad834c2011-08-21 09:29:39 -0400200 $this->_memcached->addServer(
John Bellone51e4bca2011-08-21 12:43:21 -0400201 $cache_server['hostname'],
John Bellone0ad834c2011-08-21 09:29:39 -0400202 $cache_server['port'],
203 $cache_server['weight']
204 );
205 }
Greg Akerbde25d92010-12-21 09:31:21 -0600206 }
John Bellone51758fc2011-08-21 09:38:44 -0400207
208 return TRUE;
Greg Akerbde25d92010-12-21 09:31:21 -0600209 }
210
211 // ------------------------------------------------------------------------
212
213
214 /**
215 * Is supported
216 *
217 * Returns FALSE if memcached is not supported on the system.
218 * If it is, we setup the memcached object & return TRUE
219 */
220 public function is_supported()
221 {
John Bellone9e8dc0e2011-08-21 08:54:56 -0400222 if ( ! extension_loaded('memcached') && ! extension_loaded('memcache'))
Greg Akerbde25d92010-12-21 09:31:21 -0600223 {
224 log_message('error', 'The Memcached Extension must be loaded to use Memcached Cache.');
225
226 return FALSE;
227 }
John Bellone02d73692011-08-21 09:32:35 -0400228
John Bellone51758fc2011-08-21 09:38:44 -0400229
John Bellone02d73692011-08-21 09:32:35 -0400230 return $this->_setup_memcached();
Greg Akerbde25d92010-12-21 09:31:21 -0600231 }
232
233 // ------------------------------------------------------------------------
234
235}
236// End Class
237
238/* End of file Cache_memcached.php */
239/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */