1

バックエンドで実行され、メッセージを待機している PHP デーモンと ZeroMQ を介して通信する PHP スクリプトに問題があります。デーモンがダウンしている可能性がある場合、要求元の php は無限の時間待機します。ページをリロードすると、Firefox が無限ループに陥り、実行中のリクエストを強制終了するために apache2 を再起動する必要があります。特にデーモンが完成していない開発では、本当に面倒です。誰かがタイムアウトを設定する方法を知っていますか、またはデーモンに到達できないときにリクエストの送信をスキップする方法を知っていますか(次に、管理者にメッセージを送信し、サーバーがダウンしてエラーを返します)?

私はこのようなことを試しました:

$context = new ZMQContext(1);
$req = new ZMQSocket($context, ZMQ::SOCKET_REQ);

$req->connect("tcp://localhost:5557");

$read = $write = array();

// Poll socket for a reply, with timeout
$poll = new ZMQPoll();
$poll->add($req, ZMQ::POLL_OUT);
$events = $poll->poll($read, $write, 3000);
       $errors = $poll->getLastErrors();

if($errors)   
  echo "No connection";
else 
  echo "connection";

... $data = ....
$req->send(json_encode($data));

2 番目の質問、私は shaneharter の PHP-Daemon を使用しています。エラーが原因でデーモンが正しく起動しない場合や、CRTL+C でシャットダウンした場合、zeromq はまだアドレスを予約していますが、デーモンを再起動すると例外がスローされます。このアドレスはすでに使用されています。すべての ZeroMQ 接続を簡単に破棄できますか?

4

1 に答える 1

1

簡単なメッセージを送信するためだけにポーリングする必要はありません。PUSHソケットの方が使いやすいと思います。PULL適切なリンガー値を設定すると、リッスンしているかどうかに関係 なく、ソケットの相手にメッセージを送信しようとします。

$context = new ZMQContext();
$socket = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 2000);
$socket->connect("tcp://localhost:5557");
$socket->send($data);
于 2013-05-09T01:24:11.317 に答える