Files
2026-05-13 09:43:32 -04:00

131 lines
3.0 KiB
PHP

<?php
declare(strict_types=1);
/**
* This file is part of CodeIgniter 4 framework.
*
* (c) CodeIgniter Foundation <admin@codeigniter.com>
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
namespace CodeIgniter\Cache\Handlers;
use APCUIterator;
use Closure;
use CodeIgniter\I18n\Time;
use Config\Cache;
/**
* APCu cache handler
*
* @see \CodeIgniter\Cache\Handlers\ApcuHandlerTest
*/
class ApcuHandler extends BaseHandler
{
/**
* Note: Use `CacheFactory::getHandler()` to instantiate.
*/
public function __construct(Cache $config)
{
$this->prefix = $config->prefix;
}
public function initialize(): void
{
}
public function get(string $key): mixed
{
$key = static::validateKey($key, $this->prefix);
$success = false;
$data = apcu_fetch($key, $success);
// Success returned by reference from apcu_fetch()
return $success ? $data : null;
}
public function save(string $key, $value, int $ttl = 60): bool
{
$key = static::validateKey($key, $this->prefix);
return apcu_store($key, $value, $ttl);
}
public function remember(string $key, int $ttl, Closure $callback): mixed
{
$key = static::validateKey($key, $this->prefix);
return apcu_entry($key, $callback, $ttl);
}
public function delete(string $key): bool
{
$key = static::validateKey($key, $this->prefix);
return apcu_delete($key);
}
public function deleteMatching(string $pattern): int
{
$matchedKeys = array_filter(
array_keys(iterator_to_array(new APCUIterator(null, APC_ITER_KEY))),
static fn ($key): bool => fnmatch($pattern, $key),
);
if ($matchedKeys !== []) {
return count($matchedKeys) - count(apcu_delete($matchedKeys));
}
return 0;
}
public function increment(string $key, int $offset = 1): false|int
{
$key = static::validateKey($key, $this->prefix);
return apcu_inc($key, $offset);
}
public function decrement(string $key, int $offset = 1): false|int
{
$key = static::validateKey($key, $this->prefix);
return apcu_dec($key, $offset);
}
public function clean(): bool
{
return apcu_clear_cache();
}
public function getCacheInfo(): array|false
{
return apcu_cache_info(true);
}
public function getMetaData(string $key): ?array
{
$key = static::validateKey($key, $this->prefix);
$metadata = apcu_key_info($key);
if ($metadata !== null) {
return [
'expire' => $metadata['ttl'] > 0 ? Time::now()->getTimestamp() + $metadata['ttl'] : null,
'mtime' => $metadata['mtime'],
'data' => apcu_fetch($key),
];
}
return null;
}
public function isSupported(): bool
{
return extension_loaded('apcu') && apcu_enabled();
}
}