You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
4.9 KiB
218 lines
4.9 KiB
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); |
|
/** |
|
* CodeIgniter |
|
* |
|
* An open source application development framework for PHP 4.3.2 or newer |
|
* |
|
* @package CodeIgniter |
|
* @author ExpressionEngine Dev Team |
|
* @copyright Copyright (c) 2006 - 2012 EllisLab, Inc. |
|
* @license http://codeigniter.com/user_guide/license.html |
|
* @link http://codeigniter.com |
|
* @since Version 2.0 |
|
* @filesource |
|
*/ |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
/** |
|
* CodeIgniter Memcached Caching Class |
|
* |
|
* @package CodeIgniter |
|
* @subpackage Libraries |
|
* @category Core |
|
* @author ExpressionEngine Dev Team |
|
* @link |
|
*/ |
|
|
|
class CI_Cache_memcached extends CI_Driver { |
|
|
|
private $_memcached; // Holds the memcached object |
|
|
|
protected $_memcache_conf = array( |
|
'default' => array( |
|
'default_host' => '127.0.0.1', |
|
'default_port' => 11211, |
|
'default_weight' => 1 |
|
) |
|
); |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
/** |
|
* Fetch from cache |
|
* |
|
* @param mixed unique key id |
|
* @return mixed data on success/false on failure |
|
*/ |
|
public function get($id) |
|
{ |
|
$data = $this->_memcached->get($id); |
|
|
|
return (is_array($data)) ? $data[0] : FALSE; |
|
} |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
/** |
|
* Save |
|
* |
|
* @param string unique identifier |
|
* @param mixed data being cached |
|
* @param int time to live |
|
* @return boolean true on success, false on failure |
|
*/ |
|
public function save($id, $data, $ttl = 60) |
|
{ |
|
if (get_class($this->_memcached) == 'Memcached') |
|
{ |
|
return $this->_memcached->set($id, array($data, time(), $ttl), $ttl); |
|
} |
|
else if (get_class($this->_memcached) == 'Memcache') |
|
{ |
|
return $this->_memcached->set($id, array($data, time(), $ttl), 0, $ttl); |
|
} |
|
|
|
return FALSE; |
|
} |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
/** |
|
* Delete from Cache |
|
* |
|
* @param mixed key to be deleted. |
|
* @return boolean true on success, false on failure |
|
*/ |
|
public function delete($id) |
|
{ |
|
return $this->_memcached->delete($id); |
|
} |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
/** |
|
* Clean the Cache |
|
* |
|
* @return boolean false on failure/true on success |
|
*/ |
|
public function clean() |
|
{ |
|
return $this->_memcached->flush(); |
|
} |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
/** |
|
* Cache Info |
|
* |
|
* @param null type not supported in memcached |
|
* @return mixed array on success, false on failure |
|
*/ |
|
public function cache_info($type = NULL) |
|
{ |
|
return $this->_memcached->getStats(); |
|
} |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
/** |
|
* Get Cache Metadata |
|
* |
|
* @param mixed key to get cache metadata on |
|
* @return mixed FALSE on failure, array on success. |
|
*/ |
|
public function get_metadata($id) |
|
{ |
|
$stored = $this->_memcached->get($id); |
|
|
|
if (count($stored) !== 3) |
|
{ |
|
return FALSE; |
|
} |
|
|
|
list($data, $time, $ttl) = $stored; |
|
|
|
return array( |
|
'expire' => $time + $ttl, |
|
'mtime' => $time, |
|
'data' => $data |
|
); |
|
} |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
/** |
|
* Setup memcached. |
|
*/ |
|
private function _setup_memcached() |
|
{ |
|
// Try to load memcached server info from the config file. |
|
$CI =& get_instance(); |
|
if ($CI->config->load('memcached', TRUE, TRUE)) |
|
{ |
|
if (is_array($CI->config->config['memcached'])) |
|
{ |
|
$this->_memcache_conf = NULL; |
|
|
|
foreach ($CI->config->config['memcached'] as $name => $conf) |
|
{ |
|
$this->_memcache_conf[$name] = $conf; |
|
} |
|
} |
|
} |
|
|
|
$this->_memcached = new Memcached(); |
|
|
|
foreach ($this->_memcache_conf as $name => $cache_server) |
|
{ |
|
if ( ! array_key_exists('hostname', $cache_server)) |
|
{ |
|
$cache_server['hostname'] = $this->_default_options['default_host']; |
|
} |
|
|
|
if ( ! array_key_exists('port', $cache_server)) |
|
{ |
|
$cache_server['port'] = $this->_default_options['default_port']; |
|
} |
|
|
|
if ( ! array_key_exists('weight', $cache_server)) |
|
{ |
|
$cache_server['weight'] = $this->_default_options['default_weight']; |
|
} |
|
|
|
$this->_memcached->addServer( |
|
$cache_server['hostname'], $cache_server['port'], $cache_server['weight'] |
|
); |
|
} |
|
} |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
|
|
/** |
|
* Is supported |
|
* |
|
* Returns FALSE if memcached is not supported on the system. |
|
* If it is, we setup the memcached object & return TRUE |
|
*/ |
|
public function is_supported() |
|
{ |
|
if ( ! extension_loaded('memcached')) |
|
{ |
|
log_message('error', 'The Memcached Extension must be loaded to use Memcached Cache.'); |
|
|
|
return FALSE; |
|
} |
|
|
|
$this->_setup_memcached(); |
|
return TRUE; |
|
} |
|
|
|
// ------------------------------------------------------------------------ |
|
|
|
} |
|
// End Class |
|
|
|
/* End of file Cache_memcached.php */ |
|
/* Location: ./system/libraries/Cache/drivers/Cache_memcached.php */ |