X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FCore%2FCache%2FMemcachedCache.php;h=d8fcbc770d428e1e68126f11e3493d9b82c2d23a;hb=ee8689cc899beecaf0943ac175550a7fb49cf199;hp=69f6b9a0a7c0eea4c1da800ac2ba224c5bf7a058;hpb=48caf55cff0f1ab0f0941f32461fcae37dcd6f59;p=friendica.git diff --git a/src/Core/Cache/MemcachedCache.php b/src/Core/Cache/MemcachedCache.php index 69f6b9a0a7..d8fcbc770d 100644 --- a/src/Core/Cache/MemcachedCache.php +++ b/src/Core/Cache/MemcachedCache.php @@ -1,21 +1,40 @@ . + * + */ namespace Friendica\Core\Cache; use Exception; -use Friendica\Core\Config\Configuration; +use Friendica\Core\BaseCache; +use Friendica\Core\Config\IConfig; use Memcached; use Psr\Log\LoggerInterface; /** * Memcached Cache - * - * @author Hypolite Petovan */ -class MemcachedCache extends Cache implements IMemoryCache +class MemcachedCache extends BaseCache implements IMemoryCache { use TraitCompareSet; use TraitCompareDelete; + use TraitMemcacheCommand; /** * @var \Memcached @@ -27,17 +46,6 @@ class MemcachedCache extends Cache implements IMemoryCache */ private $logger; - /** - * @var string First server address - */ - - private $firstServer; - - /** - * @var int First server port - */ - private $firstPort; - /** * Due to limitations of the INI format, the expected configuration for Memcached servers is the following: * array { @@ -49,7 +57,7 @@ class MemcachedCache extends Cache implements IMemoryCache * * @throws \Exception */ - public function __construct(string $hostname, Configuration $config, LoggerInterface $logger) + public function __construct(string $hostname, IConfig $config, LoggerInterface $logger) { if (!class_exists('Memcached', false)) { throw new Exception('Memcached class isn\'t available'); @@ -69,8 +77,8 @@ class MemcachedCache extends Cache implements IMemoryCache } }); - $this->firstServer = $memcached_hosts[0][0] ?? 'localhost'; - $this->firstPort = $memcached_hosts[0][1] ?? 11211; + $this->server = $memcached_hosts[0][0] ?? 'localhost'; + $this->port = $memcached_hosts[0][1] ?? 11211; $this->memcached->addServers($memcached_hosts); @@ -84,97 +92,11 @@ class MemcachedCache extends Cache implements IMemoryCache */ public function getAllKeys($prefix = null) { - $keys = $this->getOriginalKeys($this->getMemcachedKeys()); + $keys = $this->getOriginalKeys($this->getMemcacheKeys()); return $this->filterArrayKeysByPrefix($keys, $prefix); } - /** - * Get all memcached keys. - * Special function because getAllKeys() is broken since memcached 1.4.23. - * - * cleaned up version of code found on Stackoverflow.com by Maduka Jayalath - * @see https://stackoverflow.com/a/34724821 - * - * @return array|int - all retrieved keys (or negative number on error) - */ - private function getMemcachedKeys() - { - $mem = @fsockopen($this->firstServer, $this->firstPort); - if ($mem === false) { - return -1; - } - - // retrieve distinct slab - $r = @fwrite($mem, 'stats items' . chr(10)); - if ($r === false) { - return -2; - } - - $slab = []; - while (($l = @fgets($mem, 1024)) !== false) { - // finished? - $l = trim($l); - if ($l == 'END') { - break; - } - - $m = []; - // - $r = preg_match('/^STAT\sitems\:(\d+)\:/', $l, $m); - if ($r != 1) { - return -3; - } - $a_slab = $m[1]; - - if (!array_key_exists($a_slab, $slab)) { - $slab[$a_slab] = []; - } - } - - reset($slab); - foreach ($slab as $a_slab_key => &$a_slab) { - $r = @fwrite($mem, 'stats cachedump ' . $a_slab_key . ' 100' . chr(10)); - if ($r === false) { - return -4; - } - - while (($l = @fgets($mem, 1024)) !== false) { - // finished? - $l = trim($l); - if ($l == 'END') { - break; - } - - $m = []; - // ITEM 42 [118 b; 1354717302 s] - $r = preg_match('/^ITEM\s([^\s]+)\s/', $l, $m); - if ($r != 1) { - return -5; - } - $a_key = $m[1]; - - $a_slab[] = $a_key; - } - } - - // close the connection - @fclose($mem); - unset($mem); - - $keys = []; - reset($slab); - foreach ($slab AS &$a_slab) { - reset($a_slab); - foreach ($a_slab AS &$a_key) { - $keys[] = $a_key; - } - } - unset($slab); - - return $keys; - } - /** * (@inheritdoc) */ @@ -198,7 +120,7 @@ class MemcachedCache extends Cache implements IMemoryCache /** * (@inheritdoc) */ - public function set($key, $value, $ttl = Cache::FIVE_MINUTES) + public function set($key, $value, $ttl = Duration::FIVE_MINUTES) { $cachekey = $this->getCacheKey($key); @@ -241,7 +163,7 @@ class MemcachedCache extends Cache implements IMemoryCache /** * (@inheritdoc) */ - public function add($key, $value, $ttl = Cache::FIVE_MINUTES) + public function add($key, $value, $ttl = Duration::FIVE_MINUTES) { $cachekey = $this->getCacheKey($key); return $this->memcached->add($cachekey, $value, $ttl); @@ -252,6 +174,6 @@ class MemcachedCache extends Cache implements IMemoryCache */ public function getName() { - return self::TYPE_MEMCACHED; + return Type::MEMCACHED; } }