Exemplo n.º 1
0
 /**
  * @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;
 }
Exemplo n.º 2
0
 /**
  * {@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);
     }
 }