82 lines
1.9 KiB
PHP
82 lines
1.9 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of Twig.
|
||
|
*
|
||
|
* (c) Fabien Potencier
|
||
|
*
|
||
|
* For the full copyright and license information, please view the LICENSE
|
||
|
* file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace Twig\Cache;
|
||
|
|
||
|
/**
|
||
|
* Chains several caches together.
|
||
|
*
|
||
|
* Cached items are fetched from the first cache having them in its data store.
|
||
|
* They are saved and deleted in all adapters at once.
|
||
|
*
|
||
|
* @author Quentin Devos <quentin@devos.pm>
|
||
|
*/
|
||
|
final class ChainCache implements CacheInterface
|
||
|
{
|
||
|
private $caches;
|
||
|
|
||
|
/**
|
||
|
* @param iterable<CacheInterface> $caches The ordered list of caches used to store and fetch cached items
|
||
|
*/
|
||
|
public function __construct(iterable $caches)
|
||
|
{
|
||
|
$this->caches = $caches;
|
||
|
}
|
||
|
|
||
|
public function generateKey(string $name, string $className): string
|
||
|
{
|
||
|
return $className.'#'.$name;
|
||
|
}
|
||
|
|
||
|
public function write(string $key, string $content): void
|
||
|
{
|
||
|
$splitKey = $this->splitKey($key);
|
||
|
|
||
|
foreach ($this->caches as $cache) {
|
||
|
$cache->write($cache->generateKey(...$splitKey), $content);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function load(string $key): void
|
||
|
{
|
||
|
[$name, $className] = $this->splitKey($key);
|
||
|
|
||
|
foreach ($this->caches as $cache) {
|
||
|
$cache->load($cache->generateKey($name, $className));
|
||
|
|
||
|
if (class_exists($className, false)) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function getTimestamp(string $key): int
|
||
|
{
|
||
|
$splitKey = $this->splitKey($key);
|
||
|
|
||
|
foreach ($this->caches as $cache) {
|
||
|
if (0 < $timestamp = $cache->getTimestamp($cache->generateKey(...$splitKey))) {
|
||
|
return $timestamp;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return string[]
|
||
|
*/
|
||
|
private function splitKey(string $key): array
|
||
|
{
|
||
|
return array_reverse(explode('#', $key, 2));
|
||
|
}
|
||
|
}
|