X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FCache%2FMemcachedCacheDriver.php;h=9e9c00f0b89f25f9ffbc943ccce6aa7f4673dec2;hb=5881fa7229a25efd382668e6cd4a3af0f8d3198c;hp=9c860711f8cc8cab2d3d5ca1d073e17a1d4e9dd6;hpb=19209f6826fc513b5e1bc3460c212a4b80c02049;p=friendica.git diff --git a/src/Core/Cache/MemcachedCacheDriver.php b/src/Core/Cache/MemcachedCacheDriver.php index 9c860711f8..9e9c00f0b8 100644 --- a/src/Core/Cache/MemcachedCacheDriver.php +++ b/src/Core/Cache/MemcachedCacheDriver.php @@ -2,47 +2,66 @@ namespace Friendica\Core\Cache; -use Friendica\BaseObject; use Friendica\Core\Cache; +use Exception; +use Memcached; + /** * Memcached Cache Driver * - * @author Hypolite Petovan + * @author Hypolite Petovan */ -class MemcachedCacheDriver extends BaseObject implements IMemoryCacheDriver +class MemcachedCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver { use TraitCompareSet; use TraitCompareDelete; /** - * @var Memcached + * @var \Memcached */ private $memcached; + /** + * Due to limitations of the INI format, the expected configuration for Memcached servers is the following: + * array { + * 0 => "hostname, port(, weight)", + * 1 => ... + * } + * + * @param array $memcached_hosts + * @throws \Exception + */ public function __construct(array $memcached_hosts) { if (!class_exists('Memcached', false)) { - throw new \Exception('Memcached class isn\'t available'); + throw new Exception('Memcached class isn\'t available'); } - $this->memcached = new \Memcached(); + $this->memcached = new Memcached(); + + array_walk($memcached_hosts, function (&$value) { + if (is_string($value)) { + $value = array_map('trim', explode(',', $value)); + } + }); $this->memcached->addServers($memcached_hosts); if (count($this->memcached->getServerList()) == 0) { - throw new \Exception('Expected Memcached servers aren\'t available, config:' . var_export($memcached_hosts, true)); + throw new Exception('Expected Memcached servers aren\'t available, config:' . var_export($memcached_hosts, true)); } } public function get($key) { $return = null; + $cachekey = $this->getCacheKey($key); // We fetch with the hostname as key to avoid problems with other applications - $value = $this->memcached->get(self::getApp()->get_hostname() . ':' . $key); + $value = $this->memcached->get($cachekey); - if ($this->memcached->getResultCode() === \Memcached::RES_SUCCESS) { + if ($this->memcached->getResultCode() === Memcached::RES_SUCCESS) { $return = $value; } @@ -51,16 +70,18 @@ class MemcachedCacheDriver extends BaseObject implements IMemoryCacheDriver public function set($key, $value, $ttl = Cache::FIVE_MINUTES) { + $cachekey = $this->getCacheKey($key); + // We store with the hostname as key to avoid problems with other applications if ($ttl > 0) { return $this->memcached->set( - self::getApp()->get_hostname() . ':' . $key, + $cachekey, $value, - time() + $ttl + $ttl ); } else { return $this->memcached->set( - self::getApp()->get_hostname() . ':' . $key, + $cachekey, $value ); } @@ -69,14 +90,17 @@ class MemcachedCacheDriver extends BaseObject implements IMemoryCacheDriver public function delete($key) { - $return = $this->memcached->delete(self::getApp()->get_hostname() . ':' . $key); - - return $return; + $cachekey = $this->getCacheKey($key); + return $this->memcached->delete($cachekey); } - public function clear() + public function clear($outdated = true) { - return true; + if ($outdated) { + return true; + } else { + return $this->memcached->flush(); + } } /** @@ -89,6 +113,7 @@ class MemcachedCacheDriver extends BaseObject implements IMemoryCacheDriver */ public function add($key, $value, $ttl = Cache::FIVE_MINUTES) { - return $this->memcached->add(self::getApp()->get_hostname() . ":" . $key, $value, $ttl); + $cachekey = $this->getCacheKey($key); + return $this->memcached->add($cachekey, $value, $ttl); } }