/** * @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 sendRequest(Request $request) { $message = array($request->getType(), (string) $request->getHeaders()); if ($request->getType() !== MessageTypes::PING) { $message[] = $request->getMethodName(); foreach ($request->getArgumentsBody() as $argument) { $message[] = $argument; } } try { $this->socket->sendMulti($message); } catch (\ZMQSocketException $e) { throw new TransportException('Cannot send request', 0, $e); } }