diff --git a/config/defaults.config.php b/config/defaults.config.php index 5540ddbb44..b4471af25c 100644 --- a/config/defaults.config.php +++ b/config/defaults.config.php @@ -343,6 +343,14 @@ return [ // Port number of the redis daemon. 'redis_port' => 6379, + // redis_db (Integer) + // The sub-database of redis (0 - 15 possible sub-databases) + 'redis_db' => 0, + + // redis_password (String) + // The authentication password for the redis database + 'redis_password' => null, + // session_handler (database|cache|native) // Whether to use Cache to store session data or to use PHP native session storage. 'session_handler' => 'database', diff --git a/src/Core/Cache/RedisCacheDriver.php b/src/Core/Cache/RedisCacheDriver.php index 6559cf6a72..ea4eb4390a 100644 --- a/src/Core/Cache/RedisCacheDriver.php +++ b/src/Core/Cache/RedisCacheDriver.php @@ -20,11 +20,13 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver private $redis; /** - * @param string $redis_host - * @param int $redis_port + * @param string $redis_host + * @param int $redis_port + * @param int $redis_db (Default = 0, maximum is 15) + * @param string? $redis_pw * @throws Exception */ - public function __construct($redis_host, $redis_port) + public function __construct($redis_host, $redis_port, $redis_db = 0, $redis_pw = null) { if (!class_exists('Redis', false)) { throw new Exception('Redis class isn\'t available'); @@ -35,6 +37,14 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver if (!$this->redis->connect($redis_host, $redis_port)) { throw new Exception('Expected Redis server at ' . $redis_host . ':' . $redis_port . ' isn\'t available'); } + + if (isset($redis_pw) && !$this->redis->auth($redis_pw)) { + throw new Exception('Cannot authenticate redis server at ' . $redis_host . ':' . $redis_port); + } + + if ($redis_db !== 0 && !$this->redis->select($redis_db)) { + throw new Exception('Cannot switch to redis db ' . $redis_db . ' at ' . $redis_host . ':' . $redis_port); + } } /** diff --git a/src/Factory/CacheDriverFactory.php b/src/Factory/CacheDriverFactory.php index 1008b67944..f802d73fa6 100644 --- a/src/Factory/CacheDriverFactory.php +++ b/src/Factory/CacheDriverFactory.php @@ -2,9 +2,9 @@ namespace Friendica\Factory; +use Friendica\Core\Cache; use Friendica\Core\Cache\ICacheDriver; use Friendica\Core\Config; -use Friendica\Core\Cache; /** * Class CacheDriverFactory @@ -40,8 +40,10 @@ class CacheDriverFactory case 'redis': $redis_host = Config::get('system', 'redis_host'); $redis_port = Config::get('system', 'redis_port'); + $redis_pw = Config::get('system', 'redis_password'); + $redis_db = Config::get('system', 'redis_db', 0); - return new Cache\RedisCacheDriver($redis_host, $redis_port); + return new Cache\RedisCacheDriver($redis_host, $redis_port, $redis_db, $redis_pw); break; default: return new Cache\DatabaseCacheDriver(); diff --git a/tests/src/Core/Cache/RedisCacheDriverTest.php b/tests/src/Core/Cache/RedisCacheDriverTest.php index 80baa9f4b3..6e11c3b8a4 100644 --- a/tests/src/Core/Cache/RedisCacheDriverTest.php +++ b/tests/src/Core/Cache/RedisCacheDriverTest.php @@ -22,6 +22,16 @@ class RedisCacheDriverTest extends MemoryCacheTest ->with('system', 'redis_port') ->andReturn(null); + $this->configMock + ->shouldReceive('get') + ->with('system', 'redis_db') + ->andReturn(3); + + $this->configMock + ->shouldReceive('get') + ->with('system', 'redis_password') + ->andReturn(null); + $this->cache = CacheDriverFactory::create('redis'); return $this->cache; } diff --git a/tests/src/Core/Lock/RedisCacheLockDriverTest.php b/tests/src/Core/Lock/RedisCacheLockDriverTest.php index d21f3b6d86..21bace5018 100644 --- a/tests/src/Core/Lock/RedisCacheLockDriverTest.php +++ b/tests/src/Core/Lock/RedisCacheLockDriverTest.php @@ -3,8 +3,8 @@ namespace Friendica\Test\src\Core\Lock; -use Friendica\Factory\CacheDriverFactory; use Friendica\Core\Lock\CacheLockDriver; +use Friendica\Factory\CacheDriverFactory; /** * @requires extension redis @@ -23,6 +23,16 @@ class RedisCacheLockDriverTest extends LockTest ->with('system', 'redis_port') ->andReturn(null); + $this->configMock + ->shouldReceive('get') + ->with('system', 'redis_db') + ->andReturn(3); + + $this->configMock + ->shouldReceive('get') + ->with('system', 'redis_password') + ->andReturn(null); + return new CacheLockDriver(CacheDriverFactory::create('redis')); } }