123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\VarDumper\Caster;
- use Symfony\Component\VarDumper\Cloner\Stub;
- /**
- * Casts Redis class from ext-redis to array representation.
- *
- * @author Nicolas Grekas <p@tchwork.com>
- *
- * @final
- */
- class RedisCaster
- {
- private const SERIALIZERS = [
- \Redis::SERIALIZER_NONE => 'NONE',
- \Redis::SERIALIZER_PHP => 'PHP',
- 2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY
- ];
- private const MODES = [
- \Redis::ATOMIC => 'ATOMIC',
- \Redis::MULTI => 'MULTI',
- \Redis::PIPELINE => 'PIPELINE',
- ];
- private const COMPRESSION_MODES = [
- 0 => 'NONE', // Redis::COMPRESSION_NONE
- 1 => 'LZF', // Redis::COMPRESSION_LZF
- ];
- private const FAILOVER_OPTIONS = [
- \RedisCluster::FAILOVER_NONE => 'NONE',
- \RedisCluster::FAILOVER_ERROR => 'ERROR',
- \RedisCluster::FAILOVER_DISTRIBUTE => 'DISTRIBUTE',
- \RedisCluster::FAILOVER_DISTRIBUTE_SLAVES => 'DISTRIBUTE_SLAVES',
- ];
- public static function castRedis(\Redis $c, array $a, Stub $stub, bool $isNested)
- {
- $prefix = Caster::PREFIX_VIRTUAL;
- if (!$connected = $c->isConnected()) {
- return $a + [
- $prefix.'isConnected' => $connected,
- ];
- }
- $mode = $c->getMode();
- return $a + [
- $prefix.'isConnected' => $connected,
- $prefix.'host' => $c->getHost(),
- $prefix.'port' => $c->getPort(),
- $prefix.'auth' => $c->getAuth(),
- $prefix.'mode' => isset(self::MODES[$mode]) ? new ConstStub(self::MODES[$mode], $mode) : $mode,
- $prefix.'dbNum' => $c->getDbNum(),
- $prefix.'timeout' => $c->getTimeout(),
- $prefix.'lastError' => $c->getLastError(),
- $prefix.'persistentId' => $c->getPersistentID(),
- $prefix.'options' => self::getRedisOptions($c),
- ];
- }
- public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, bool $isNested)
- {
- $prefix = Caster::PREFIX_VIRTUAL;
- return $a + [
- $prefix.'hosts' => $c->_hosts(),
- $prefix.'function' => ClassStub::wrapCallable($c->_function()),
- $prefix.'lastError' => $c->getLastError(),
- $prefix.'options' => self::getRedisOptions($c),
- ];
- }
- public static function castRedisCluster(\RedisCluster $c, array $a, Stub $stub, bool $isNested)
- {
- $prefix = Caster::PREFIX_VIRTUAL;
- $failover = $c->getOption(\RedisCluster::OPT_SLAVE_FAILOVER);
- $a += [
- $prefix.'_masters' => $c->_masters(),
- $prefix.'_redir' => $c->_redir(),
- $prefix.'mode' => new ConstStub($c->getMode() ? 'MULTI' : 'ATOMIC', $c->getMode()),
- $prefix.'lastError' => $c->getLastError(),
- $prefix.'options' => self::getRedisOptions($c, [
- 'SLAVE_FAILOVER' => isset(self::FAILOVER_OPTIONS[$failover]) ? new ConstStub(self::FAILOVER_OPTIONS[$failover], $failover) : $failover,
- ]),
- ];
- return $a;
- }
- /**
- * @param \Redis|\RedisArray|\RedisCluster $redis
- */
- private static function getRedisOptions($redis, array $options = []): EnumStub
- {
- $serializer = $redis->getOption(\Redis::OPT_SERIALIZER);
- if (\is_array($serializer)) {
- foreach ($serializer as &$v) {
- if (isset(self::SERIALIZERS[$v])) {
- $v = new ConstStub(self::SERIALIZERS[$v], $v);
- }
- }
- } elseif (isset(self::SERIALIZERS[$serializer])) {
- $serializer = new ConstStub(self::SERIALIZERS[$serializer], $serializer);
- }
- $compression = \defined('Redis::OPT_COMPRESSION') ? $redis->getOption(\Redis::OPT_COMPRESSION) : 0;
- if (\is_array($compression)) {
- foreach ($compression as &$v) {
- if (isset(self::COMPRESSION_MODES[$v])) {
- $v = new ConstStub(self::COMPRESSION_MODES[$v], $v);
- }
- }
- } elseif (isset(self::COMPRESSION_MODES[$compression])) {
- $compression = new ConstStub(self::COMPRESSION_MODES[$compression], $compression);
- }
- $retry = \defined('Redis::OPT_SCAN') ? $redis->getOption(\Redis::OPT_SCAN) : 0;
- if (\is_array($retry)) {
- foreach ($retry as &$v) {
- $v = new ConstStub($v ? 'RETRY' : 'NORETRY', $v);
- }
- } else {
- $retry = new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry);
- }
- $options += [
- 'TCP_KEEPALIVE' => \defined('Redis::OPT_TCP_KEEPALIVE') ? $redis->getOption(\Redis::OPT_TCP_KEEPALIVE) : 0,
- 'READ_TIMEOUT' => $redis->getOption(\Redis::OPT_READ_TIMEOUT),
- 'COMPRESSION' => $compression,
- 'SERIALIZER' => $serializer,
- 'PREFIX' => $redis->getOption(\Redis::OPT_PREFIX),
- 'SCAN' => $retry,
- ];
- return new EnumStub($options);
- }
- }
|