2012-06-08 21 views
6

He estado usando ZeroMQ con bastante éxito con PHP y he escrito un servidor de trabajos. Tengo un script de administrador que verifica el estado del servidor y hace cosas como hacer ping con un tiempo de espera.¿Cómo desconectar el zócalo ZeroMQ después del tiempo de espera?

Todo funciona muy bien cuando el servidor está activo, pero cuando está inactivo (y ZMQPoll se agota el tiempo previsto) mi secuencia de comandos hace lo que se supone que debe - PERO la secuencia de comandos nunca termina.

He intentado limpiar y desarmar todas las variables de socket, etc. pero incluso al llamar al exit(), se cuelga el script de PHP.

No parece haber un método de socket disconnect(), entonces, ¿cómo le digo a PHP que el socket está muerto y no quiero que cuelgue?

Este es un fragmento de código a continuación de mi guión 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

Guardado mi día! ¡Gracias! – Franquis

Respuesta

7

ZeroMQ intentará entregar mensajes en espera cuando se apaga - se puede controlar que al establecer la opción de conector ZMQ :: SOCKOPT_LINGER (que debe hacer antes de se conecta), lo que debería permitirle finalizar rápidamente.

Tome un vistazo a la broca ZMQ_LINGER en http://api.zeromq.org/2-1:zmq-setsockopt

Cuestiones relacionadas