Skip to content
Snippets Groups Projects
Commit 5418c98a authored by Robin Appelman's avatar Robin Appelman
Browse files

Add memcached backend

parent 80a3f8d0
No related branches found
No related tags found
No related merge requests found
...@@ -20,6 +20,8 @@ abstract class Cache { ...@@ -20,6 +20,8 @@ abstract class Cache {
return new XCache($global); return new XCache($global);
} elseif (APC::isAvailable()) { } elseif (APC::isAvailable()) {
return new APC($global); return new APC($global);
} elseif (Memcached::isAvailable()) {
return new Memcached($global);
} else { } else {
return null; return null;
} }
...@@ -65,5 +67,7 @@ abstract class Cache { ...@@ -65,5 +67,7 @@ abstract class Cache {
/** /**
* @return bool * @return bool
*/ */
//static public function isAvailable(); static public function isAvailable() {
return XCache::isAvailable() || APC::isAvailable() || Memcached::isAvailable();
}
} }
<?php
/**
* Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OC\Memcache;
class Memcached extends Cache {
protected $prefix;
/**
* @var \Memcached $cache
*/
private static $cache = null;
public function __construct($global = false) {
$this->prefix = \OC_Util::getInstanceId() . '/';
if (!$global) {
$this->prefix .= \OC_User::getUser() . '/';
}
if (is_null(self::$cache)) {
self::$cache = new \Memcached();
list($host, $port) = \OC_Config::getValue('memcached_server', array('localhost', 11211));
self::$cache->addServer($host, $port);
}
}
/**
* entries in XCache gets namespaced to prevent collisions between owncloud instances and users
*/
protected function getNameSpace() {
return $this->prefix;
}
public function get($key) {
$result = self::$cache->get($this->getNamespace() . $key);
if ($result === false and self::$cache->getResultCode() == \Memcached::RES_NOTFOUND) {
return null;
} else {
return $result;
}
}
public function set($key, $value, $ttl = 0) {
if ($ttl > 0) {
return self::$cache->set($this->getNamespace() . $key, $value, $ttl);
} else {
return self::$cache->set($this->getNamespace() . $key, $value);
}
}
public function hasKey($key) {
self::$cache->get($this->getNamespace() . $key);
return self::$cache->getResultCode() !== \Memcached::RES_NOTFOUND;
}
public function remove($key) {
return self::$cache->delete($this->getNamespace() . $key);
}
public function clear($prefix = '') {
$prefix = $this->getNamespace() . $prefix;
$allKeys = self::$cache->getAllKeys();
$keys = array();
$prefixLength = strlen($prefix);
foreach ($allKeys as $key) {
if (substr($key, 0, $prefixLength) === $prefix) {
$keys[] = $key;
}
}
self::$cache->deleteMulti($keys);
return true;
}
static public function isAvailable() {
return extension_loaded('memcached');
}
}
<?php
/**
* Copyright (c) 2013 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
class Test_Memcache_Memcached extends Test_Cache {
public function setUp() {
if (!\OC\Memcache\Memcached::isAvailable()) {
$this->markTestSkipped('The memcached extension is not available.');
return;
}
$this->instance = new \OC\Memcache\Memcached();
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment