204 lines
5.6 KiB
PHP

<?php
/**
*
* This file is part of phpFastCache.
*
* @license MIT License (MIT)
*
* For full copyright and license information, please see the docs/CREDITS.txt file.
*
* @author Georges.L (Geolim4) <contact@geolim4.com>
*
*/
declare(strict_types=1);
namespace Phpfastcache\Cluster\Drivers\SemiReplication;
use Phpfastcache\Cluster\ClusterPoolAbstract;
use Phpfastcache\Core\Item\ExtendedCacheItemInterface;
use Phpfastcache\Exceptions\PhpfastcacheExceptionInterface;
use Phpfastcache\Exceptions\PhpfastcacheReplicationException;
use Psr\Cache\CacheItemInterface;
/**
* Class FullReplicationCluster
* @package Phpfastcache\Cluster\Drivers\FullReplication
*/
class SemiReplicationCluster extends ClusterPoolAbstract
{
/**
* @inheritDoc
*/
public function getItem($key)
{
/** @var ExtendedCacheItemInterface $item */
$item = null;
$eCount = 0;
foreach ($this->clusterPools as $driverPool) {
try {
$poolItem = $driverPool->getItem($key);
if ($poolItem->isHit()) {
if (!$item) {
$item = $poolItem;
break;
}
}
} catch (PhpfastcacheExceptionInterface $e) {
$eCount++;
}
}
if (\count($this->clusterPools) <= $eCount) {
throw new PhpfastcacheReplicationException('Every pools thrown an exception');
}
return $this->getStandardizedItem($item ?? new Item($this, $key), $this);
}
/**
* @inheritDoc
*/
public function hasItem($key)
{
$eCount = 0;
foreach ($this->clusterPools as $driverPool) {
try {
$poolItem = $driverPool->getItem($key);
if ($poolItem->isHit()) {
return true;
}
} catch (PhpfastcacheExceptionInterface $e) {
$eCount++;
}
}
if (\count($this->clusterPools) <= $eCount) {
throw new PhpfastcacheReplicationException('Every pools thrown an exception');
}
return false;
}
/**
* @inheritDoc
*/
public function clear()
{
$hasClearedOnce = false;
$eCount = 0;
foreach ($this->clusterPools as $driverPool) {
try {
if ($result = $driverPool->clear()) {
$hasClearedOnce = $result;
}
} catch (PhpfastcacheExceptionInterface $e) {
$eCount++;
}
}
if (\count($this->clusterPools) <= $eCount) {
throw new PhpfastcacheReplicationException('Every pools thrown an exception');
}
// Return true only if at least one backend confirmed the "clear" operation
return $hasClearedOnce;
}
/**
* @inheritDoc
*/
public function deleteItem($key)
{
$hasDeletedOnce = false;
$eCount = 0;
foreach ($this->clusterPools as $driverPool) {
try {
if ($result = $driverPool->deleteItem($key)) {
$hasDeletedOnce = $result;
}
} catch (PhpfastcacheExceptionInterface $e) {
$eCount++;
}
}
if (\count($this->clusterPools) <= $eCount) {
throw new PhpfastcacheReplicationException('Every pools thrown an exception');
}
// 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;
$eCount = 0;
foreach ($this->clusterPools as $driverPool) {
try {
$poolItem = $this->getStandardizedItem($item, $driverPool);
if ($result = $driverPool->save($poolItem)) {
$hasSavedOnce = $result;
}
} catch (PhpfastcacheExceptionInterface $e) {
$eCount++;
}
}
if (\count($this->clusterPools) <= $eCount) {
throw new PhpfastcacheReplicationException('Every pools thrown an exception');
}
// 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;
$eCount = 0;
foreach ($this->clusterPools as $driverPool) {
try {
if ($result = $driverPool->commit()) {
$hasCommitOnce = $result;
}
} catch (PhpfastcacheExceptionInterface $e) {
$eCount++;
}
}
if (\count($this->clusterPools) <= $eCount) {
throw new PhpfastcacheReplicationException('Every pools thrown an exception');
}
// Return true only if at least one backend confirmed the "commit" operation
return $hasCommitOnce;
}
}