. namespace core\local\guzzle; use Kevinrob\GuzzleCache\CacheEntry; use Kevinrob\GuzzleCache\Storage\CacheStorageInterface; /** * Cache storage handler to handle cache objects, TTL etc. * * @package core * @copyright 2022 safatshahin * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class cache_storage implements CacheStorageInterface { /** * The cache pool. * * @var cache_handler */ protected $cachepool; /** * The last item retrieved from the cache. * * This item is transiently stored so that save() can reuse the cache item * usually retrieved by fetch() beforehand, instead of requesting it a second time. * * @var cache_item|null */ protected $lastitem; /** * TTL for the cache. * * @var int|null time to live. */ private int $ttl; public function __construct(cache_handler $cachepool, ?int $ttl = null) { $this->cachepool = $cachepool; $this->ttl = $ttl; } public function fetch($key): ?CacheEntry { // Refresh the cache files. if ($this->ttl) { $this->cachepool->refresh($this->ttl); } $item = $this->cachepool->get_item($key, $this->ttl); $this->lastitem = $item; $cache = $item->get(); if ($cache instanceof CacheEntry) { return $cache; } return null; } public function save($key, CacheEntry $data): bool { if ($this->lastitem && $this->lastitem->get_key() === $key) { $item = $this->lastitem; } else { $item = $this->cachepool->get_item($key); } $this->lastitem = null; $item->set($data); // Check if the TTL is set, otherwise use from data. $ttl = $this->ttl ?? $data->getTTL(); if ($ttl === 0) { // No expiration. $item->expires_after(null); } else { $item->expires_after($ttl); } return $this->cachepool->save($item); } public function delete($key): bool { if (null !== $this->lastitem && $this->lastitem->get_key() === $key) { $this->lastitem = null; } return $this->cachepool->delete_item($key); } }