2012-06-08 15 views
6

Ho usato ZeroMQ con successo con PHP e ho scritto un job server. Ho uno script di amministrazione che controlla l'integrità del server e fa cose come il ping con un timeout.Come scollegare il socket ZeroMQ dopo il timeout?

Tutto funziona alla grande quando il server è attivo, ma quando è inattivo (e ZMQPoll timeout come previsto) il mio script fa quello che dovrebbe - MA lo script non termina mai.

Ho provato a pulire e disattivare tutte le variabili di socket, ecc., Ma anche chiamando lo exit() lo script PHP si blocca.

Non sembra essere un metodo socket disconnect(), quindi come faccio a dire a PHP che il socket è morto e non voglio che si blocchi?

Si tratta di un frammento di codice seguente dal mio script admin -

 // ... 
     // waiting for dead server on zmqsock to respond after sending a message 
     // 
     $poll = new ZMQPoll; 
     $poll->add($this->zmqsock, ZMQ::POLL_IN); 
     $readable = $writeable = array(); 
     $poll->poll($readable, $writeable, $timeout * 1000); 
     if($errors = $poll->getLastErrors()) { 
      foreach ($errors as $err) { 
       throw new Exception($err); 
      } 
     } 
     if(! $readable){ 
      // clean up everything, raise errors, etc.. 
      $poll->clear(); 
      unset($poll, $this->zmqsock, $this->zmqcontext); 
      // Script hangs here 
      exit(0); 
     } 
     // .. 
+0

salvato la mia giornata! Grazie! – Franquis

risposta

7

ZeroMQ cercherà di fornire in attesa di messaggi quando si spegne - si può controllare che impostando l'opzione socket ZMQ :: SOCKOPT_LINGER (che devi fare prima del che ti colleghi), che dovrebbe consentirti di terminare rapidamente.

Date un'occhiata al bit ZMQ_LINGER su http://api.zeromq.org/2-1:zmq-setsockopt

Problemi correlati