From 84a22a788ebc456356543b7a4ff72792ee95ca48 Mon Sep 17 00:00:00 2001 From: Zankaria Date: Thu, 29 May 2025 23:53:29 +0200 Subject: [PATCH 1/4] CacheDriverTrait.php: add CacheDriverTrait to share code --- inc/Data/Driver/CacheDriverTrait.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 inc/Data/Driver/CacheDriverTrait.php diff --git a/inc/Data/Driver/CacheDriverTrait.php b/inc/Data/Driver/CacheDriverTrait.php new file mode 100644 index 00000000..16e56ce0 --- /dev/null +++ b/inc/Data/Driver/CacheDriverTrait.php @@ -0,0 +1,20 @@ + Date: Thu, 29 May 2025 23:54:53 +0200 Subject: [PATCH 2/4] RedisCacheDriver.php: use CacheDriverTrait --- inc/Data/Driver/RedisCacheDriver.php | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/inc/Data/Driver/RedisCacheDriver.php b/inc/Data/Driver/RedisCacheDriver.php index 389fff32..c71c8779 100644 --- a/inc/Data/Driver/RedisCacheDriver.php +++ b/inc/Data/Driver/RedisCacheDriver.php @@ -5,18 +5,17 @@ defined('TINYBOARD') or exit; class RedisCacheDriver implements CacheDriver { + use CacheDriverTrait; + private string $prefix; private \Redis $inner; public function __construct(string $prefix, string $host, ?int $port, ?string $password, int $database) { $this->inner = new \Redis(); - if (str_starts_with($host, 'unix:') || str_starts_with($host, ':')) { - $ret = \explode(':', $host); - if (count($ret) < 2) { - throw new \RuntimeException("Invalid unix socket path $host"); - } - // Unix socket. - $this->inner->connect($ret[1]); + $maybe_unix = self::asUnixSocketPath($host); + + if ($maybe_unix !== null) { + $this->inner->connect($maybe_unix); } elseif ($port === null) { $this->inner->connect($host); } else { From 37e771f0bec9d5cd0be80969e2fe84e31e75d2a3 Mon Sep 17 00:00:00 2001 From: Zankaria Date: Thu, 29 May 2025 23:55:04 +0200 Subject: [PATCH 3/4] MemcacheCacheDriver.php: fix configuration --- inc/Data/Driver/MemcacheCacheDriver.php | 34 ++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/inc/Data/Driver/MemcacheCacheDriver.php b/inc/Data/Driver/MemcacheCacheDriver.php index 04f62895..f05c51e7 100644 --- a/inc/Data/Driver/MemcacheCacheDriver.php +++ b/inc/Data/Driver/MemcacheCacheDriver.php @@ -5,9 +5,12 @@ defined('TINYBOARD') or exit; class MemcachedCacheDriver implements CacheDriver { + use CacheDriverTrait; + private \Memcached $inner; - public function __construct(string $prefix, string $memcached_server) { + + public function __construct(string $prefix, string $server_uri, int $server_port, int $server_weight) { $this->inner = new \Memcached(); if (!$this->inner->setOption(\Memcached::OPT_BINARY_PROTOCOL, true)) { throw new \RuntimeException('Unable to set the memcached protocol!'); @@ -15,8 +18,33 @@ class MemcachedCacheDriver implements CacheDriver { if (!$this->inner->setOption(\Memcached::OPT_PREFIX_KEY, $prefix)) { throw new \RuntimeException('Unable to set the memcached prefix!'); } - if (!$this->inner->addServers($memcached_server)) { - throw new \RuntimeException('Unable to add the memcached server!'); + + $maybe_unix_path = self::asUnixSocketPath($server_uri); + $is_unix = $maybe_unix_path !== null; + if ($is_unix) { + $server_uri = $maybe_unix_path; + } + + // Memcached keeps the server connections open across requests. + $current_servers = $this->inner->getServerList(); + $found_in_curr = false; + foreach ($current_servers as $curr) { + // Ignore the port if the server is connected with a unix socket. + if ($curr['host'] === $server_uri && ($is_unix || $curr['port'] === $server_port)) { + $found_in_curr = true; + } + } + + if (!$found_in_curr) { + if (!empty($current_servers)) { + if ($this->inner->resetServerList()) { + throw new \RuntimeException('Unable to reset the memcached server list!'); + } + + if ($this->inner->addServer($server_uri, $server_port, $server_weight)) { + throw new \RuntimeException('Unable to add memcached servers!'); + } + } } } From de9d118390178fdb64d0ee8880f1f2087844f60e Mon Sep 17 00:00:00 2001 From: Zankaria Date: Thu, 29 May 2025 23:59:20 +0200 Subject: [PATCH 4/4] cache.php: update MemcachedCacheDriver initialization --- inc/cache.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/inc/cache.php b/inc/cache.php index d26f9201..182d6fda 100644 --- a/inc/cache.php +++ b/inc/cache.php @@ -15,10 +15,18 @@ class Cache { switch ($config['cache']['enabled']) { case 'memcached': - return new MemcachedCacheDriver( - $config['cache']['prefix'], - $config['cache']['memcached'] - ); + $prefix = $config['cache']['prefix']; + $uri = $config['cache']['memcached'][0]; + $port = 0; + $weight = 0; + if (isset($config['cache']['memcached'][1]) && $config['cache']['memcached'][1] !== null) { + $port = \intval($config['cache']['memcached'][1]); + } + if (isset($config['cache']['memcached'][2]) && $config['cache']['memcached'][2] !== null) { + $weight = \intval($config['cache']['memcached'][2]); + } + + return new MemcachedCacheDriver($prefix, $uri, $port, $weight); case 'redis': $port = $config['cache']['redis'][1]; $port = empty($port) ? null : intval($port);