/** * Internal method to get capabilities of this adapter * * @return Capabilities */ protected function internalGetCapabilities() { if ($this->capabilities === null) { $this->capabilityMarker = new stdClass(); $minTtl = $this->resourceManager->getMajorVersion($this->resourceId) < 2 ? 0 : 1; //without serialization redis supports only strings for simple //get/set methods $this->capabilities = new Capabilities($this, $this->capabilityMarker, array('supportedDatatypes' => array('NULL' => 'string', 'boolean' => 'string', 'integer' => 'string', 'double' => 'string', 'string' => true, 'array' => false, 'object' => false, 'resource' => false), 'supportedMetadata' => array(), 'minTtl' => $minTtl, 'maxTtl' => 0, 'staticTtl' => true, 'ttlPrecision' => 1, 'useRequestTime' => false, 'expiredRead' => false, 'maxKeyLength' => 255, 'namespaceIsPrefix' => true)); } return $this->capabilities; }
/** * {@inheritDoc} * * @throws Exception\ExceptionInterface */ protected function internalGetMetadata(&$normalizedKey) { $redis = $this->getRedisResource(); $metadata = []; try { $redisVersion = $this->resourceManager->getMajorVersion($this->resourceId); // redis >= 2.8 // The command 'pttl' returns -2 if the item does not exist // and -1 if the item has no associated expire if (version_compare($redisVersion, '2.8', '>=')) { $pttl = $redis->pttl($this->namespacePrefix . $normalizedKey); if ($pttl <= -2) { return false; } $metadata['ttl'] = $pttl == -1 ? null : $pttl / 1000; // redis >= 2.6 // The command 'pttl' returns -1 if the item does not exist or the item as no associated expire } elseif (version_compare($redisVersion, '2.6', '>=')) { $pttl = $redis->pttl($this->namespacePrefix . $normalizedKey); if ($pttl <= -1) { if (!$this->internalHasItem($normalizedKey)) { return false; } $metadata['ttl'] = null; } else { $metadata['ttl'] = $pttl / 1000; } // redis >= 2 // The command 'pttl' is not supported but 'ttl' // The command 'ttl' returns 0 if the item does not exist same as if the item is going to be expired // NOTE: In case of ttl=0 we return false because the item is going to be expired in a very near future // and then doesn't exist any more } elseif (version_compare($redisVersion, '2', '>=')) { $ttl = $redis->ttl($this->namespacePrefix . $normalizedKey); if ($ttl <= -1) { if (!$this->internalHasItem($normalizedKey)) { return false; } $metadata['ttl'] = null; } else { $metadata['ttl'] = $ttl; } // redis < 2 // The commands 'pttl' and 'ttl' are not supported // but item existence have to be checked } elseif (!$this->internalHasItem($normalizedKey)) { return false; } } catch (RedisResourceException $e) { throw new Exception\RuntimeException($redis->getLastError(), $e->getCode(), $e); } return $metadata; }