Subversion-Projekte lars-tiefland.ci

Revision

Revision 2257 | Details | Vergleich mit vorheriger | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
68 lars 1
<?php
2
/**
3
 * CodeIgniter
4
 *
5
 * An open source application development framework for PHP
6
 *
7
 * This content is released under the MIT License (MIT)
8
 *
2414 lars 9
 * Copyright (c) 2014 - 2019, British Columbia Institute of Technology
68 lars 10
 *
11
 * 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:
17
 *
18
 * 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
31
 * @copyright	Copyright (c) 2008 - 2014, EllisLab, Inc. (https://ellislab.com/)
2414 lars 32
 * @copyright	Copyright (c) 2014 - 2019, British Columbia Institute of Technology (https://bcit.ca/)
33
 * @license	https://opensource.org/licenses/MIT	MIT License
68 lars 34
 * @link	https://codeigniter.com
35
 * @since	Version 2.0
36
 * @filesource
37
 */
38
defined('BASEPATH') OR exit('No direct script access allowed');
39
 
40
/**
41
 * CodeIgniter Memcached Caching Class
42
 *
43
 * @package		CodeIgniter
44
 * @subpackage	Libraries
45
 * @category	Core
46
 * @author		EllisLab Dev Team
47
 * @link
48
 */
49
class CI_Cache_memcached extends CI_Driver {
50
 
51
	/**
52
	 * Holds the memcached object
53
	 *
54
	 * @var object
55
	 */
56
	protected $_memcached;
57
 
58
	/**
59
	 * Memcached configuration
60
	 *
61
	 * @var array
62
	 */
63
	protected $_config = array(
64
		'default' => array(
65
			'host'		=> '127.0.0.1',
66
			'port'		=> 11211,
67
			'weight'	=> 1
68
		)
69
	);
70
 
71
	// ------------------------------------------------------------------------
72
 
73
	/**
74
	 * Class constructor
75
	 *
76
	 * Setup Memcache(d)
77
	 *
78
	 * @return	void
79
	 */
80
	public function __construct()
81
	{
82
		// Try to load memcached server info from the config file.
83
		$CI =& get_instance();
84
		$defaults = $this->_config['default'];
85
 
86
		if ($CI->config->load('memcached', TRUE, TRUE))
87
		{
88
			$this->_config = $CI->config->config['memcached'];
89
		}
90
 
91
		if (class_exists('Memcached', FALSE))
92
		{
93
			$this->_memcached = new Memcached();
94
		}
95
		elseif (class_exists('Memcache', FALSE))
96
		{
97
			$this->_memcached = new Memcache();
98
		}
99
		else
100
		{
101
			log_message('error', 'Cache: Failed to create Memcache(d) object; extension not loaded?');
102
			return;
103
		}
104
 
105
		foreach ($this->_config as $cache_server)
106
		{
107
			isset($cache_server['hostname']) OR $cache_server['hostname'] = $defaults['host'];
108
			isset($cache_server['port']) OR $cache_server['port'] = $defaults['port'];
109
			isset($cache_server['weight']) OR $cache_server['weight'] = $defaults['weight'];
110
 
111
			if ($this->_memcached instanceof Memcache)
112
			{
2107 lars 113
				// Third parameter is persistence and defaults to TRUE.
68 lars 114
				$this->_memcached->addServer(
115
					$cache_server['hostname'],
116
					$cache_server['port'],
117
					TRUE,
118
					$cache_server['weight']
119
				);
120
			}
121
			elseif ($this->_memcached instanceof Memcached)
122
			{
123
				$this->_memcached->addServer(
124
					$cache_server['hostname'],
125
					$cache_server['port'],
126
					$cache_server['weight']
127
				);
128
			}
129
		}
130
	}
131
 
132
	// ------------------------------------------------------------------------
133
 
134
	/**
135
	 * Fetch from cache
136
	 *
137
	 * @param	string	$id	Cache ID
138
	 * @return	mixed	Data on success, FALSE on failure
139
	 */
140
	public function get($id)
141
	{
142
		$data = $this->_memcached->get($id);
143
 
144
		return is_array($data) ? $data[0] : $data;
145
	}
146
 
147
	// ------------------------------------------------------------------------
148
 
149
	/**
150
	 * Save
151
	 *
152
	 * @param	string	$id	Cache ID
153
	 * @param	mixed	$data	Data being cached
154
	 * @param	int	$ttl	Time to live
155
	 * @param	bool	$raw	Whether to store the raw value
156
	 * @return	bool	TRUE on success, FALSE on failure
157
	 */
158
	public function save($id, $data, $ttl = 60, $raw = FALSE)
159
	{
160
		if ($raw !== TRUE)
161
		{
162
			$data = array($data, time(), $ttl);
163
		}
164
 
165
		if ($this->_memcached instanceof Memcached)
166
		{
167
			return $this->_memcached->set($id, $data, $ttl);
168
		}
169
		elseif ($this->_memcached instanceof Memcache)
170
		{
171
			return $this->_memcached->set($id, $data, 0, $ttl);
172
		}
173
 
174
		return FALSE;
175
	}
176
 
177
	// ------------------------------------------------------------------------
178
 
179
	/**
180
	 * Delete from Cache
181
	 *
182
	 * @param	mixed	$id	key to be deleted.
183
	 * @return	bool	true on success, false on failure
184
	 */
185
	public function delete($id)
186
	{
187
		return $this->_memcached->delete($id);
188
	}
189
 
190
	// ------------------------------------------------------------------------
191
 
192
	/**
193
	 * Increment a raw value
194
	 *
195
	 * @param	string	$id	Cache ID
196
	 * @param	int	$offset	Step/value to add
197
	 * @return	mixed	New value on success or FALSE on failure
198
	 */
199
	public function increment($id, $offset = 1)
200
	{
2257 lars 201
		if (($result = $this->_memcached->increment($id, $offset)) === FALSE)
202
		{
203
			return $this->_memcached->add($id, $offset) ? $offset : FALSE;
204
		}
205
 
206
		return $result;
68 lars 207
	}
208
 
209
	// ------------------------------------------------------------------------
210
 
211
	/**
212
	 * Decrement a raw value
213
	 *
214
	 * @param	string	$id	Cache ID
215
	 * @param	int	$offset	Step/value to reduce by
216
	 * @return	mixed	New value on success or FALSE on failure
217
	 */
218
	public function decrement($id, $offset = 1)
219
	{
2257 lars 220
		if (($result = $this->_memcached->decrement($id, $offset)) === FALSE)
221
		{
222
			return $this->_memcached->add($id, 0) ? 0 : FALSE;
223
		}
224
 
225
		return $result;
68 lars 226
	}
227
 
228
	// ------------------------------------------------------------------------
229
 
230
	/**
231
	 * Clean the Cache
232
	 *
233
	 * @return	bool	false on failure/true on success
234
	 */
235
	public function clean()
236
	{
237
		return $this->_memcached->flush();
238
	}
239
 
240
	// ------------------------------------------------------------------------
241
 
242
	/**
243
	 * Cache Info
244
	 *
245
	 * @return	mixed	array on success, false on failure
246
	 */
247
	public function cache_info()
248
	{
249
		return $this->_memcached->getStats();
250
	}
251
 
252
	// ------------------------------------------------------------------------
253
 
254
	/**
255
	 * Get Cache Metadata
256
	 *
257
	 * @param	mixed	$id	key to get cache metadata on
258
	 * @return	mixed	FALSE on failure, array on success.
259
	 */
260
	public function get_metadata($id)
261
	{
262
		$stored = $this->_memcached->get($id);
263
 
264
		if (count($stored) !== 3)
265
		{
266
			return FALSE;
267
		}
268
 
269
		list($data, $time, $ttl) = $stored;
270
 
271
		return array(
272
			'expire'	=> $time + $ttl,
273
			'mtime'		=> $time,
274
			'data'		=> $data
275
		);
276
	}
277
 
278
	// ------------------------------------------------------------------------
279
 
280
	/**
281
	 * Is supported
282
	 *
283
	 * Returns FALSE if memcached is not supported on the system.
284
	 * If it is, we setup the memcached object & return TRUE
285
	 *
286
	 * @return	bool
287
	 */
288
	public function is_supported()
289
	{
290
		return (extension_loaded('memcached') OR extension_loaded('memcache'));
291
	}
292
 
293
	// ------------------------------------------------------------------------
294
 
295
	/**
296
	 * Class destructor
297
	 *
298
	 * Closes the connection to Memcache(d) if present.
299
	 *
300
	 * @return	void
301
	 */
302
	public function __destruct()
303
	{
304
		if ($this->_memcached instanceof Memcache)
305
		{
306
			$this->_memcached->close();
307
		}
308
		elseif ($this->_memcached instanceof Memcached && method_exists($this->_memcached, 'quit'))
309
		{
310
			$this->_memcached->quit();
311
		}
312
	}
313
}