2012-06-08 2 views
6

Я довольно успешно использовал ZeroMQ с PHP и написал сервер заданий. У меня есть скрипт администратора, который проверяет работоспособность сервера и делает что-то вроде pinging его с таймаутом.Как отключить сокет ZeroMQ после таймаута?

Все работает отлично, когда сервер работает, но когда он выключен (и ZMQPoll раза в ожидании), мой скрипт делает то, что он должен - НО сценарий никогда не заканчивается.

Я попытался очистить и отключить все переменные сокета и т. Д., Но даже при вызове exit() скрипт PHP зависает.

Не похоже, что есть сокет disconnect(), так как я могу сказать PHP, что сокет мертв, и я не хочу, чтобы он зависал?

Это фрагмент кода ниже моего администратора сценария -

 // ... 
     // 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

Сохраненная мой день! Благодаря! – Franquis

ответ

7

ZeroMQ будет пытаться доставить в ожидании сообщения, когда он выключается - вы можете контролировать, что, установив опцию ZMQ :: SOCKOPT_LINGER сокет (который вы должны сделать до, который вы подключаете), что должно позволить вам быстро завершить работу.

Посмотрите на бите ZMQ_LINGER на http://api.zeromq.org/2-1:zmq-setsockopt

Смежные вопросы