]> git.mxchange.org Git - friendica.git/blobdiff - src/Core/Cache/MemcachedCache.php
Merge branch 'bug/phpinfo-accessible-hotfix' into develop
[friendica.git] / src / Core / Cache / MemcachedCache.php
index 89685c3f255ce44f83d5745e934eea4a6803c4b5..d8fcbc770d428e1e68126f11e3493d9b82c2d23a 100644 (file)
@@ -1,21 +1,40 @@
 <?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
 
 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 <hypolite@mrpetovan.com>
  */
-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,96 +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
-        *
-        * @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 = [];
-                       // <STAT items:22:evicted_nonzero 0>
-                       $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)
         */
@@ -197,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);
 
@@ -240,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);
@@ -251,6 +174,6 @@ class MemcachedCache extends Cache implements IMemoryCache
         */
        public function getName()
        {
-               return self::TYPE_MEMCACHED;
+               return Type::MEMCACHED;
        }
 }