/** * @param string $request */ public function request($request) { // Prefix request with sequence number and empty envelope $this->sequence++; $msg = array('', $this->sequence, $request); // Blast the request to all connected servers for ($server = 1; $server <= $this->servers; $server++) { $this->socket->sendMulti($msg); } // Wait for a matching reply to arrive from anywhere // Since we can poll several times, calculate each one $poll = new ZMQPoll(); $poll->add($this->socket, ZMQ::POLL_IN); $reply = null; $endtime = time() + self::GLOBAL_TIMEOUT / 1000; while (time() < $endtime) { $readable = $writable = array(); $events = $poll->poll($readable, $writable, ($endtime - time()) * 1000); foreach ($readable as $sock) { if ($sock == $this->socket) { $reply = $this->socket->recvMulti(); if (count($reply) != 3) { exit; } $sequence = $reply[1]; if ($sequence == $this->sequence) { break; } } } } return $reply; }
/** * {@inheritDoc} */ public function receiveResponse() { try { $result = $this->socket->recvMulti(); } catch (\ZMQSocketException $e) { throw new TransportException('Cannot receive response', 0, $e); } if ($result === false) { throw new TimeoutException('Timeout (' . $this->getTimeout() . 's) reached'); } if (!isset($result[0])) { throw new FormatException('Invalid response - no response type', $result); } if (!isset($result[1])) { throw new FormatException('Invalid response - no headers', $result); } $response = new Response($result[0]); $response->setHeaders(new Headers(Parser::parseHeaders($result[1]))); if (!MessageTypes::isResponseTypeWithResult($response->getType())) { return $response; } if (!isset($result[2])) { throw new FormatException('Invalid response - no response body', $result); } return $response->setResultBody($result[2]); }