/var/www/vhosts/ihelp.ro/_OLD/vendor/cakephp/cakephp/src/Cache/Engine
Edit: /var/www/vhosts/ihelp.ro/_OLD/vendor/cakephp/cakephp/src/Cache/Engine/RedisEngine.php (10692B)
0,
'duration' => 3600,
'groups' => [],
'password' => false,
'persistent' => true,
'port' => 6379,
'prefix' => 'cake_',
'host' => null,
'server' => '127.0.0.1',
'timeout' => 0,
'unix_socket' => false,
];
/**
* Initialize the Cache Engine
*
* Called automatically by the cache frontend
*
* @param array $config array of setting for the engine
* @return bool True if the engine has been successfully initialized, false if not
*/
public function init(array $config = []): bool
{
if (!extension_loaded('redis')) {
throw new RuntimeException('The `redis` extension must be enabled to use RedisEngine.');
}
if (!empty($config['host'])) {
$config['server'] = $config['host'];
}
parent::init($config);
return $this->_connect();
}
/**
* Connects to a Redis server
*
* @return bool True if Redis server was connected
*/
protected function _connect(): bool
{
try {
$this->_Redis = new Redis();
if (!empty($this->_config['unix_socket'])) {
$return = $this->_Redis->connect($this->_config['unix_socket']);
} elseif (empty($this->_config['persistent'])) {
$return = $this->_Redis->connect(
$this->_config['server'],
(int)$this->_config['port'],
(int)$this->_config['timeout']
);
} else {
$persistentId = $this->_config['port'] . $this->_config['timeout'] . $this->_config['database'];
$return = $this->_Redis->pconnect(
$this->_config['server'],
(int)$this->_config['port'],
(int)$this->_config['timeout'],
$persistentId
);
}
} catch (RedisException $e) {
return false;
}
if ($return && $this->_config['password']) {
$return = $this->_Redis->auth($this->_config['password']);
}
if ($return) {
$return = $this->_Redis->select((int)$this->_config['database']);
}
return $return;
}
/**
* Write data for key into cache.
*
* @param string $key Identifier for the data
* @param mixed $value Data to be cached
* @param \DateInterval|int|null $ttl Optional. The TTL value of this item. If no value is sent and
* the driver supports TTL then the library may set a default value
* for it or let the driver take care of that.
* @return bool True if the data was successfully cached, false on failure
*/
public function set($key, $value, $ttl = null): bool
{
$key = $this->_key($key);
$value = $this->serialize($value);
$duration = $this->duration($ttl);
if ($duration === 0) {
return $this->_Redis->set($key, $value);
}
return $this->_Redis->setEx($key, $duration, $value);
}
/**
* Read a key from the cache
*
* @param string $key Identifier for the data
* @param mixed $default Default value to return if the key does not exist.
* @return mixed The cached data, or the default if the data doesn't exist, has
* expired, or if there was an error fetching it
*/
public function get($key, $default = null)
{
$value = $this->_Redis->get($this->_key($key));
if ($value === false) {
return $default;
}
return $this->unserialize($value);
}
/**
* Increments the value of an integer cached key & update the expiry time
*
* @param string $key Identifier for the data
* @param int $offset How much to increment
* @return int|false New incremented value, false otherwise
*/
public function increment(string $key, int $offset = 1)
{
$duration = $this->_config['duration'];
$key = $this->_key($key);
$value = (int)$this->_Redis->incrBy($key, $offset);
if ($duration > 0) {
$this->_Redis->expire($key, $duration);
}
return $value;
}
/**
* Decrements the value of an integer cached key & update the expiry time
*
* @param string $key Identifier for the data
* @param int $offset How much to subtract
* @return int|false New decremented value, false otherwise
*/
public function decrement(string $key, int $offset = 1)
{
$duration = $this->_config['duration'];
$key = $this->_key($key);
$value = (int)$this->_Redis->decrBy($key, $offset);
if ($duration > 0) {
$this->_Redis->expire($key, $duration);
}
return $value;
}
/**
* Delete a key from the cache
*
* @param string $key Identifier for the data
* @return bool True if the value was successfully deleted, false if it didn't exist or couldn't be removed
*/
public function delete($key): bool
{
$key = $this->_key($key);
return $this->_Redis->del($key) > 0;
}
/**
* Delete all keys from the cache
*
* @return bool True if the cache was successfully cleared, false otherwise
*/
public function clear(): bool
{
$this->_Redis->setOption(Redis::OPT_SCAN, (string)Redis::SCAN_RETRY);
$isAllDeleted = true;
$iterator = null;
$pattern = $this->_config['prefix'] . '*';
while (true) {
$keys = $this->_Redis->scan($iterator, $pattern);
if ($keys === false) {
break;
}
foreach ($keys as $key) {
$isDeleted = ($this->_Redis->del($key) > 0);
$isAllDeleted = $isAllDeleted && $isDeleted;
}
}
return $isAllDeleted;
}
/**
* Write data for key into cache if it doesn't exist already.
* If it already exists, it fails and returns false.
*
* @param string $key Identifier for the data.
* @param mixed $value Data to be cached.
* @return bool True if the data was successfully cached, false on failure.
* @link https://github.com/phpredis/phpredis#set
*/
public function add(string $key, $value): bool
{
$duration = $this->_config['duration'];
$key = $this->_key($key);
$value = $this->serialize($value);
if ($this->_Redis->set($key, $value, ['nx', 'ex' => $duration])) {
return true;
}
return false;
}
/**
* Returns the `group value` for each of the configured groups
* If the group initial value was not found, then it initializes
* the group accordingly.
*
* @return string[]
*/
public function groups(): array
{
$result = [];
foreach ($this->_config['groups'] as $group) {
$value = $this->_Redis->get($this->_config['prefix'] . $group);
if (!$value) {
$value = $this->serialize(1);
$this->_Redis->set($this->_config['prefix'] . $group, $value);
}
$result[] = $group . $value;
}
return $result;
}
/**
* Increments the group value to simulate deletion of all keys under a group
* old values will remain in storage until they expire.
*
* @param string $group name of the group to be cleared
* @return bool success
*/
public function clearGroup(string $group): bool
{
return (bool)$this->_Redis->incr($this->_config['prefix'] . $group);
}
/**
* Serialize value for saving to Redis.
*
* This is needed instead of using Redis' in built serialization feature
* as it creates problems incrementing/decrementing intially set integer value.
*
* @param mixed $value Value to serialize.
* @return string
* @link https://github.com/phpredis/phpredis/issues/81
*/
protected function serialize($value): string
{
if (is_int($value)) {
return (string)$value;
}
return serialize($value);
}
/**
* Unserialize string value fetched from Redis.
*
* @param string $value Value to unserialize.
* @return mixed
*/
protected function unserialize(string $value)
{
if (preg_match('/^[-]?\d+$/', $value)) {
return (int)$value;
}
return unserialize($value);
}
/**
* Disconnects from the redis server
*/
public function __destruct()
{
if (empty($this->_config['persistent']) && $this->_Redis instanceof Redis) {
$this->_Redis->close();
}
}
}