/**
* @var CacheProvider[]
*/
- private $cacheProviders = array();
+ private $cacheProviders = [];
/**
* Constructor
*
* @param CacheProvider[] $cacheProviders
*/
- public function __construct($cacheProviders = array())
+ public function __construct($cacheProviders = [])
{
- $this->cacheProviders = $cacheProviders;
+ $this->cacheProviders = $cacheProviders instanceof \Traversable
+ ? iterator_to_array($cacheProviders, false)
+ : array_values($cacheProviders);
}
/**
return false;
}
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ /* @var $traversedProviders CacheProvider[] */
+ $traversedProviders = [];
+ $keysCount = count($keys);
+ $fetchedValues = [];
+
+ foreach ($this->cacheProviders as $key => $cacheProvider) {
+ $fetchedValues = $cacheProvider->doFetchMultiple($keys);
+
+ // We populate all the previous cache layers (that are assumed to be faster)
+ if (count($fetchedValues) === $keysCount) {
+ foreach ($traversedProviders as $previousCacheProvider) {
+ $previousCacheProvider->doSaveMultiple($fetchedValues);
+ }
+
+ return $fetchedValues;
+ }
+
+ $traversedProviders[] = $cacheProvider;
+ }
+
+ return $fetchedValues;
+ }
+
/**
* {@inheritDoc}
*/
return $stored;
}
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSaveMultiple(array $keysAndValues, $lifetime = 0)
+ {
+ $stored = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $stored = $cacheProvider->doSaveMultiple($keysAndValues, $lifetime) && $stored;
+ }
+
+ return $stored;
+ }
+
/**
* {@inheritDoc}
*/
return $deleted;
}
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDeleteMultiple(array $keys)
+ {
+ $deleted = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $deleted = $cacheProvider->doDeleteMultiple($keys) && $deleted;
+ }
+
+ return $deleted;
+ }
+
/**
* {@inheritDoc}
*/
protected function doGetStats()
{
// We return all the stats from all adapters
- $stats = array();
+ $stats = [];
foreach ($this->cacheProviders as $cacheProvider) {
$stats[] = $cacheProvider->doGetStats();