私はZeroMQをPHPでうまく使い、ジョブサーバーを書いています。 私は、サーバーの健全性をチェックし、タイムアウトでpingを実行するような管理スクリプトを持っています。タイムアウト後にZeroMQソケットを切断する方法は?
サーバーが稼働しているときにすべてがうまく動作しますが、ダウンしたときには(期待通りにZMQPoll
がタイムアウトします)、スクリプトが想定しているとおりの処理を行いますが、スクリプトは終了しません。
私は、すべてのソケット変数などをクリーンアップしたりアンセットアップしたりしましたが、exit()
というPHPスクリプトもハングします。
ソケットdisconnect()
メソッドが存在しないようですので、ソケットが死んでいるとPHPに知らせるにはどうすればいいですか?
これは私の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);
}
// ..
上ZMQ_LINGERビットを見てみましょう!ありがとう! – Franquis