From 73125f02702f4bdb631324c1ee8bb561bc1b2526 Mon Sep 17 00:00:00 2001 From: Kamil Madejski Date: Mon, 25 Jun 2018 15:40:29 +0200 Subject: [PATCH] [Cache] Added support for Redis igbinary serializer --- .../Cache/Tests/Adapter/PredisAdapterTest.php | 1 + .../Cache/Tests/Adapter/RedisAdapterTest.php | 4 ++++ src/Symfony/Component/Cache/Traits/RedisTrait.php | 11 +++++++++++ 3 files changed, 16 insertions(+) diff --git a/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php index c005d64abf1ca..2797d4527070b 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/PredisAdapterTest.php @@ -45,6 +45,7 @@ public function testCreateConnection() 'read_timeout' => 0, 'retry_interval' => 0, 'lazy' => false, + 'serializer' => 0, 'database' => '1', 'password' => null, ); diff --git a/src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterTest.php b/src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterTest.php index 28c310fb18daa..54c5cc209062f 100644 --- a/src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterTest.php +++ b/src/Symfony/Component/Cache/Tests/Adapter/RedisAdapterTest.php @@ -39,6 +39,7 @@ public function testCreateConnection() $this->assertInstanceOf(\Redis::class, $redis); $this->assertTrue($redis->isConnected()); $this->assertSame(0, $redis->getDbNum()); + $this->assertEquals(0, $redis->getOption(\Redis::OPT_SERIALIZER)); $redis = RedisAdapter::createConnection('redis://'.$redisHost.'/2'); $this->assertSame(2, $redis->getDbNum()); @@ -51,6 +52,9 @@ public function testCreateConnection() $redis = RedisAdapter::createConnection('redis://'.$redisHost, array('read_timeout' => 5)); $this->assertEquals(5, $redis->getReadTimeout()); + + $redis = RedisAdapter::createConnection('redis://'.$redisHost, array('serializer' => 2)); + $this->assertEquals(2, $redis->getOption(\Redis::OPT_SERIALIZER)); } /** diff --git a/src/Symfony/Component/Cache/Traits/RedisTrait.php b/src/Symfony/Component/Cache/Traits/RedisTrait.php index 5a9592a901549..9afef1c017f55 100644 --- a/src/Symfony/Component/Cache/Traits/RedisTrait.php +++ b/src/Symfony/Component/Cache/Traits/RedisTrait.php @@ -35,7 +35,9 @@ trait RedisTrait 'read_timeout' => 0, 'retry_interval' => 0, 'lazy' => false, + 'serializer' => 0, ); + private $redis; /** @@ -65,6 +67,7 @@ private function init($redisClient, $namespace = '', $defaultLifetime = 0) * - redis://secret@example.com/13 * - redis:///var/run/redis.sock * - redis://secret@/var/run/redis.sock/13 + * - redis://localhost?serializer=igbinary * * @param string $dsn * @param array $options See self::$defaultConnectionOptions @@ -116,6 +119,13 @@ public static function createConnection($dsn, array $options = array()) $class = null === $params['class'] ? (extension_loaded('redis') ? \Redis::class : \Predis\Client::class) : $params['class']; if (is_a($class, \Redis::class, true)) { + if (isset($params['serializer']) && array_key_exists($params['serializer'], $serializers = [ + 'none' => \Redis::SERIALIZER_NONE, + 'php' => \Redis::SERIALIZER_PHP, + 'igbinary' => \Redis::SERIALIZER_IGBINARY, + ])) { + $params['serializer'] = $serializers[$params['serializer']]; + } $connect = $params['persistent'] || $params['persistent_id'] ? 'pconnect' : 'connect'; $redis = new $class(); @@ -137,6 +147,7 @@ public static function createConnection($dsn, array $options = array()) if ((null !== $auth && !$redis->auth($auth)) || ($params['dbindex'] && !$redis->select($params['dbindex'])) || ($params['read_timeout'] && !$redis->setOption(\Redis::OPT_READ_TIMEOUT, $params['read_timeout'])) + || ($params['serializer'] && !$redis->setOption(\Redis::OPT_SERIALIZER, $params['serializer'])) ) { $e = preg_replace('/^ERR /', '', $redis->getLastError()); throw new InvalidArgumentException(sprintf('Redis connection failed (%s): %s', $e, $dsn));