Files
predis/lib/Predis/Pipeline/SafeClusterExecutor.php
T
2011-04-04 11:42:52 +02:00

59 lines
1.9 KiB
PHP

<?php
namespace Predis\Pipeline;
use Predis\ServerException;
use Predis\CommunicationException;
use Predis\Network\IConnection;
class SafeClusterExecutor implements IPipelineExecutor {
public function execute(IConnection $connection, &$commands) {
$connectionExceptions = array();
$sizeofPipe = count($commands);
$values = array();
foreach ($commands as $command) {
$cmdConnection = $connection->getConnection($command);
if (isset($connectionExceptions[spl_object_hash($cmdConnection)])) {
continue;
}
try {
$cmdConnection->writeCommand($command);
}
catch (CommunicationException $exception) {
$connectionExceptions[spl_object_hash($cmdConnection)] = $exception;
}
}
for ($i = 0; $i < $sizeofPipe; $i++) {
$command = $commands[$i];
unset($commands[$i]);
$cmdConnection = $connection->getConnection($command);
$connectionObjectHash = spl_object_hash($cmdConnection);
if (isset($connectionExceptions[$connectionObjectHash])) {
$values[] = $connectionExceptions[$connectionObjectHash];
continue;
}
try {
$response = $cmdConnection->readResponse($command);
$values[] = ($response instanceof \Iterator
? iterator_to_array($response)
: $response
);
}
catch (ServerException $exception) {
$values[] = $exception->toResponseError();
}
catch (CommunicationException $exception) {
$values[] = $exception;
$connectionExceptions[$connectionObjectHash] = $exception;
}
}
return $values;
}
}