* */ declare(strict_types=1); namespace Phpfastcache\Cluster\Drivers\FullReplication; use Phpfastcache\Cluster\ClusterPoolAbstract; use Phpfastcache\Core\Item\ExtendedCacheItemInterface; use Phpfastcache\Core\Pool\ExtendedCacheItemPoolInterface; use Psr\Cache\CacheItemInterface; /** * Class FullReplicationCluster * @package Phpfastcache\Cluster\Drivers\FullReplication */ class FullReplicationCluster extends ClusterPoolAbstract { /** * @inheritDoc */ public function getItem($key) { /** @var ExtendedCacheItemPoolInterface[] $poolsToResync */ $poolsToResync = []; /** @var ExtendedCacheItemInterface $item */ $item = null; foreach ($this->clusterPools as $driverPool) { $poolItem = $driverPool->getItem($key); if ($poolItem->isHit()) { if (!$item) { $item = $poolItem; continue; } $itemData = $item->get(); $poolItemData = $poolItem->get(); if (\is_object($itemData) ) { if ($item->get() != $poolItemData) { $poolsToResync[] = $driverPool; } } else { if ($item->get() !== $poolItemData) { $poolsToResync[] = $driverPool; } } } else { $poolsToResync[] = $driverPool; } } if ($item && $item->isHit() && \count($poolsToResync) < \count($this->clusterPools)) { foreach ($poolsToResync as $poolToResync) { $poolItem = $poolToResync->getItem($key); $poolItem->setEventManager($this->getEventManager()) ->set($item->get()) ->setHit($item->isHit()) ->setTags($item->getTags()) ->expiresAt($item->getExpirationDate()) ->setDriver($poolToResync); $poolToResync->save($poolItem); } } return $this->getStandardizedItem($item ?? new Item($this, $key), $this); } /** * @inheritDoc */ public function hasItem($key) { foreach ($this->clusterPools as $driverPool) { $poolItem = $driverPool->getItem($key); if ($poolItem->isHit()) { return true; } } return false; } /** * @inheritDoc */ public function clear() { $hasClearedOnce = false; foreach ($this->clusterPools as $driverPool) { if ($result = $driverPool->clear()) { $hasClearedOnce = $result; } } // Return true only if at least one backend confirmed the "clear" operation return $hasClearedOnce; } /** * @inheritDoc */ public function deleteItem($key) { $hasDeletedOnce = false; foreach ($this->clusterPools as $driverPool) { if ($result = $driverPool->deleteItem($key)) { $hasDeletedOnce = $result; } } // Return true only if at least one backend confirmed the "clear" operation return $hasDeletedOnce; } /** * @inheritDoc */ public function save(CacheItemInterface $item) { /** @var ExtendedCacheItemInterface $item */ $hasSavedOnce = false; foreach ($this->clusterPools as $driverPool) { $poolItem = $this->getStandardizedItem($item, $driverPool); if ($result = $driverPool->save($poolItem)) { $hasSavedOnce = $result; } } // Return true only if at least one backend confirmed the "commit" operation return $hasSavedOnce; } /** * @inheritDoc */ public function saveDeferred(CacheItemInterface $item) { /** @var ExtendedCacheItemInterface $item */ $hasSavedOnce = false; foreach ($this->clusterPools as $driverPool) { $poolItem = $this->getStandardizedItem($item, $driverPool); if ($result = $driverPool->saveDeferred($poolItem)) { $hasSavedOnce = $result; } } // Return true only if at least one backend confirmed the "commit" operation return $hasSavedOnce; } /** * @inheritDoc */ public function commit() { $hasCommitOnce = false; foreach ($this->clusterPools as $driverPool) { if ($result = $driverPool->commit()) { $hasCommitOnce = $result; } } // Return true only if at least one backend confirmed the "commit" operation return $hasCommitOnce; } }