Как отключить сокет ZeroMQ после истечения времени ожидания?

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

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

Я пробовал очищать и сбрасывать все переменные сокета и т. д., но даже при вызове exit()PHP-скрипт зависал.

По-видимому, не существует метода socket 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);
        }
        // ..
6
задан Tim 8 June 2012 в 10:22
поделиться