9

私は Ratchet を使用して PHP WebSocket をテストしてきましたが、明らかな理由もなく ZMQSocket::send が突然ハングし始めるまで、すべてが完全に機能していました。

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify');
$res = $socket->send(json_encode($entryData)); //Hangs here.

ZMQ::MODE_NOBLOCK を使用できることに注意してください。これによりハングは停止しますが、問題は解決しません。つまり、クライアントはまだ何も受信していません。また、ボックスを再起動しましたが、問題は解決しません。

  • Ubuntu 12.04.1 LTS
  • PHP バージョン 5.3.10 - FPM/(およびプッシュ サーバー用の CLI)
  • ZMQ 拡張バージョン 1.1.2
  • libzmq バージョン 2.1.11

更新:コードを次のように変更して、問題を修正したようです:

$context = new ZMQContext();
$socket = $context->getSocket(ZMQ::SOCKET_PUSH, 'notify');
$socket->setSockOpt(ZMQ::SOCKOPT_LINGER, 30); //ADDED
$socket->connect("tcp://localhost:5557"); //ADDED
$res = $socket->send(json_encode($entryData));

問題は、1 時間か 2 時間ほど正常に動作していたのに、そもそもなぜハングしたのかということです。私が気をつけなければならないことはありますか?

4

1 に答える 1

1

まず、これが有効な答えかどうかはわかりませんが、数日間 php-zmq で遊んでいて、自分自身でいくつかの問題を抱えています。あなたの質問は、私の問題を解決する可能性が高いひらめきに私を導きました。

最後の php-zmq の問題で、 zguideのトリップ方法を使用して、ラップトップと VPS 間の往復時間をテストしていました。VPS に URL を追加して、ラップトップの tripping.php スクリプトのコピーを変更し、VPS でリモートで実行されている同じスクリプトに接続するようにしました。長い while ループで同期セクションを実行し、同じ for ループを使用して非同期セクションを実行していました。

ラップトップから複数のクライアントを接続しようとした場合でも、ラップトップから 1 つと別のサーバーから 1 つを接続しようとした場合でも、同期ループの実行中に一度に接続できる「クライアント」は 1 つだけであることに気付きました。一度に接続します。また、非同期セクションで、メッセージがラップトップに戻ってくるとすぐに、1 秒あたりのメッセージ数が 1 秒あたり約 100 メッセージから約 2 秒に減少していることに気付きました。私のラップトップは、cURL を使用して 1 秒あたり 10 以上の HTTP リクエストを簡単に実行できるため、1 メッセージあたり 2 秒という時間はネットワークに関係ありません。

私は 6 年間、PHP 拡張機能の開発者であり、PHP コアのハッカーでもありますが、以前にもこのような問題に遭遇したことがあります。PHP ユーザー空間と内部の Zeromq スレッドとの間の並行性の問題によるものだと確信しています。言い換えれば、Zeromq IO スレッドはメインの Zeromq スレッドにコマンドを送信していますが、メインの zeromq スレッドは Zend エンジンを介して PHP 内で実行されており、他の PHP メソッド/関数と同じ基本的な動作にバインドされています。このため、php-zmq で czmq やその他の zeromq バインディングとまったく同じ動作を期待できるかどうかはまだわかりません。PHP は本質的に非常に同期的であり、zeromq は非同期です。php-zmq でノンブロッキング パターンを使用する場合、私の経験はほとんどの場合肯定的です。

編集: 考えられる問題を明確にするために - Zeromq はすべての IO を別々のスレッドで非同期に処理します。ブロッキング動作 (req/rep など) は、実際のブロッキング/同期 IO ではなく、IO スレッドとメイン スレッド間のメッセージングによって作成されます。PHP内で動作がおかしいと思われるのは、スレッド間のメッセージングと同期です。「ノンブロッキング」の Zeromq パターンは正常に機能しているようです。ブロッキング パターンは機能しますが、これらのリモート ケースでは奇妙な動作を示しています。

于 2014-02-18T05:21:09.560 に答える