私は、ZeroMQ を PHP でかなりうまく使用しており、ジョブ サーバーを作成しました。サーバーの状態をチェックし、タイムアウトでpingを実行するなどの管理スクリプトがあります。
サーバーが稼働している場合はすべてうまく機能しますが、サーバーが停止している場合 (および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);
}
// ..