getClient()->getConnection(); } /** * {@inheritdoc} */ protected function executePipeline(ConnectionInterface $connection, SplQueue $commands) { if ($connection instanceof NodeConnectionInterface) { return $this->executeSingleNode($connection, $commands); } elseif ($connection instanceof ClusterInterface) { return $this->executeCluster($connection, $commands); } $class = get_class($connection); throw new NotSupportedException("The connection class '$class' is not supported."); } /** * {@inheritdoc} */ protected function executeSingleNode(NodeConnectionInterface $connection, SplQueue $commands) { $responses = []; $sizeOfPipe = count($commands); $buffer = ''; foreach ($commands as $command) { $buffer .= $command->serializeCommand(); } try { $connection->write($buffer); } catch (CommunicationException $exception) { return array_fill(0, $sizeOfPipe, $exception); } for ($i = 0; $i < $sizeOfPipe; ++$i) { $command = $commands->dequeue(); try { $responses[$i] = $connection->readResponse($command); } catch (CommunicationException $exception) { $add = $sizeOfPipe - count($responses); $responses = array_merge($responses, array_fill(0, $add, $exception)); break; } } return $responses; } /** * {@inheritdoc} */ protected function executeCluster(ClusterInterface $connection, SplQueue $commands) { $responses = []; $sizeOfPipe = count($commands); $exceptions = []; foreach ($commands as $command) { $nodeConnection = $connection->getConnectionByCommand($command); $nodeConnection->write($command->serializeCommand()); } for ($i = 0; $i < $sizeOfPipe; ++$i) { $command = $commands->dequeue(); $cmdConnection = $connection->getConnectionByCommand($command); $connectionId = spl_object_id($cmdConnection); if (isset($exceptions[$connectionId])) { $responses[$i] = $exceptions[$connectionId]; continue; } try { $responses[$i] = $cmdConnection->readResponse($command); } catch (CommunicationException $exception) { $responses[$i] = $exception; $exceptions[$connectionId] = $exception; } } return $responses; } }