Source for file memcached.php
Documentation is available at memcached.php
* @package Joomla.Platform
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE
* Memcached cache storage handler
* @package Joomla.Platform
* @see http://php.net/manual/en/book.memcached.php
* Memcached connection object
protected static $_db =
null;
* Persistent session flag
* Payload compression level
* @param array $options Optional parameters.
* Return memcached connection object
* @return object memcached connection object
* @throws RuntimeException
$this->_persistent =
$config->get('memcache_persist', true);
$this->_compress =
$config->get('memcache_compress', false) ==
false ?
0 :
Memcached::OPT_COMPRESSION;
* This will be an array of loveliness
* @todo: multiple servers
* $servers = (isset($params['servers'])) ? $params['servers'] : array();
$server['host'] =
$config->get('memcache_server_host', 'localhost');
$server['port'] =
$config->get('memcache_server_port', 11211);
// Create the memcache connection
self::$_db =
new Memcached($session->getId());
self::$_db =
new Memcached;
$memcachedtest =
self::$_db->addServer($server['host'], $server['port']);
if ($memcachedtest ==
false)
throw
new RuntimeException('Could not connect to memcached server', 404);
self::$_db->setOption(Memcached::OPT_COMPRESSION, $this->_compress);
// Memcached has no list keys, we do our own accounting, initialise key index
if (self::$_db->get($this->_hash .
'-index') ===
false)
self::$_db->set($this->_hash .
'-index', $empty, 0);
* Get cached data from memcached by id and group
* @param string $id The cache data id
* @param string $group The cache data group
* @param boolean $checkTime True to verify cache time expiration threshold
* @return mixed Boolean false on failure or a cached data string
public function get($id, $group, $checkTime =
true)
$back =
self::$_db->get($cache_id);
$keys =
self::$_db->get($this->_hash .
'-index');
if (!empty($keys) &&
is_array($keys))
$namearr =
explode('-', $key->name);
if ($namearr !==
false &&
$namearr[0] ==
$secret &&
$namearr[1] ==
'cache')
if (!isset
($data[$group]))
$item->updateSize($key->size /
1024);
* Store the data to memcached by id and group
* @param string $id The cache data id
* @param string $group The cache data group
* @param string $data The data to store in cache
* @return boolean True on success, false otherwise
public function store($id, $group, $data)
$index =
self::$_db->get($this->_hash .
'-index');
$tmparr->name =
$cache_id;
$tmparr->size =
strlen($data);
self::$_db->replace($this->_hash .
'-index', $index, 0);
// Prevent double writes, write only if it doesn't exist else replace
if (!self::$_db->replace($cache_id, $data, $this->_lifetime))
self::$_db->set($cache_id, $data, $this->_lifetime);
* Remove a cached data entry by id and group
* @param string $id The cache data id
* @param string $group The cache data group
* @return boolean True on success, false otherwise
public function remove($id, $group)
$index =
self::$_db->get($this->_hash .
'-index');
foreach ($index as $key =>
$value)
if ($value->name ==
$cache_id)
self::$_db->replace($this->_hash .
'-index', $index, 0);
return self::$_db->delete($cache_id);
* Clean cache for a group given a mode.
* @param string $group The cache data group
* @param string $mode The mode for cleaning cache [group|notgroup]
* group mode : cleans all cache in the group
* notgroup mode : cleans all cache not in the group
* @return boolean True on success, false otherwise
public function clean($group, $mode =
null)
$index =
self::$_db->get($this->_hash .
'-index');
foreach ($index as $key =>
$value)
if (strpos($value->name, $secret .
'-cache-' .
$group .
'-') ===
0 xor $mode !=
'group')
self::$_db->delete($value->name, 0);
self::$_db->replace($this->_hash .
'-index', $index, 0);
* Test to see if the cache storage is available.
* @return boolean True on success, false otherwise.
$host =
$config->get('memcache_server_host', 'localhost');
$port =
$config->get('memcache_server_port', 11211);
$memcached =
new Memcached;
$memcachedtest =
@$memcached->addServer($host, $port);
* Lock cached item - override parent as this is more efficient
* @param string $id The cache data id
* @param string $group The cache data group
* @param integer $locktime Cached item max lock time
* @return boolean True on success, false otherwise.
public function lock($id, $group, $locktime)
$returning =
new stdClass;
$returning->locklooped =
false;
$looptime =
$locktime *
10;
$index =
self::$_db->get($this->_hash .
'-index');
$tmparr->name =
$cache_id;
self::$_db->replace($this->_hash .
'-index', $index, 0);
$data_lock =
self::$_db->add($cache_id .
'_lock', 1, $locktime);
if ($data_lock ===
false)
// Loop until you find that the lock has been released.
// That implies that data get from other thread has finished
while ($data_lock ===
false)
if ($lock_counter >
$looptime)
$returning->locked =
false;
$returning->locklooped =
true;
$data_lock =
self::$_db->add($cache_id .
'_lock', 1, $locktime);
$returning->locked =
$data_lock;
* Unlock cached item - override parent for cacheid compatibility with lock
* @param string $id The cache data id
* @param string $group The cache data group
* @return boolean True on success, false otherwise.
public function unlock($id, $group =
null)
$index =
self::$_db->get($this->_hash .
'-index');
foreach ($index as $key =>
$value)
if ($value->name ==
$cache_id)
self::$_db->replace($this->_hash .
'-index', $index, 0);
return self::$_db->delete($cache_id);
* @return boolean True on success, false otherwise.
$data_lock =
self::$_db->add($this->_hash .
'-index_lock', 1, 30);
if ($data_lock ===
false)
// Loop until you find that the lock has been released. that implies that data get from other thread has finished
while ($data_lock ===
false)
if ($lock_counter >
$looptime)
$data_lock =
self::$_db->add($this->_hash .
'-index_lock', 1, 30);
* @return boolean True on success, false otherwise.
return self::$_db->delete($this->_hash .
'-index_lock');
Documentation generated on Tue, 19 Nov 2013 15:07:47 +0100 by phpDocumentor 1.4.3