まず、パブリッシュ/サブスクライブ
複数のコンシューマ(消費者)にメッセージを配布します。このモードは、「パブリッシュ/サブスクライブ」と呼ばれています。
このモデルを記述するために、我々は、簡単なロギングシステムを構築していきます。これは2つの手順から構成 - メッセージログの送信を担当プログラムは、第2のプログラムは、メッセージの内容を取得して出力するための責任があります。
このログシステムでは、プログラムを実行しているすべての受信機はメッセージを受け付けます。私たちは、一つの受信機(レシーバー)のログ書き込みハードドライブ、さらに受信機(レシーバー)画面への出力をログを使用します。
最後に、ログメッセージは、すべての受信者(受信機)に放送されます。
第二に、スイッチ(交流)
- パブリッシャー(プロデューサー)は、情報のアプリケーション普及です。
- 待ち行列(キュー)メッセージを格納するためのバッファ。
- 消費者(消費者)は、メッセージを受信するアプリケーションです。
核となるアイデアは、RabbitMQのメッセージングモデルである:出版社(プロデューサー)がキューに直接任意のメッセージを送信しません。実際には、発行者(プロデューサー)も、メッセージがキューに配信されたかどうかわかりません。
パブリッシャー(プロデューサー)は、単なるスイッチ(交換機)にメッセージを送信する必要があります。プッシュメッセージキューながら、それは、出版社側からメッセージを受信しながら、交換器は、非常に簡単です。スイッチは、指定されたキューまたは複数のキューにプッシュする必要があり、それが受信したメッセージを処理する方法を知っている、またはメッセージを無視しなければなりません。これらの規則はである交換タイプ定義されました。
スイッチの種類を選択することがいくつかあります。
AMQPEXTYPEDIRECT
AMQPEXTYPEFANOUT
AMQPEXTYPEHEADERまたはAMQPEXTYPETOPIC
ここでは主な説明AMQPEXTYPE_FANOUT。スイッチのファンアウトタイプを作成し、名前のログ:
$exchange->setName('logs'); $exchange->setType(AMQP_EX_TYPE_FANOUT); $exchange->declareExchange();
ファンアウトスイッチは非常に簡単です、あなたが名前から推測することができるかもしれない、それは知っているすべてのキューにメッセージを送信します。これは、私たちがロギングシステムを必要とするものです。
今、私たちは、名前のスイッチにメッセージを送ることができます。
$exchange->publish($message, '');
第三に、一時キュー
キュー名が非常に重要であるために - 私たちは正しいキューへの労働者(労働者)のポイントを必要としています。あなたが出版社(生産者)と消費者(消費者)の間で同じキューを共有する場合は、キュー名に非常に重要です。
しかし、これは私たちのロギングシステムには適用されません。私たちは、むしろちょうど小さい部分よりも、すべてのログメッセージを受信する予定。我々は、代わりに古いの最新ニュースと懸念されています。この問題を解決するために、我々は2つのことを行う必要があります。
我々はRabbitMQのを接続したときにまず第一に、我々は新しい、空のキューが必要です。私たちは、手動でランダムなキュー名を作成するか、聞かせすることができ、サーバーが私たちのために、ランダムなキュー名(推奨)を選びます。私達はちょうど$ queue-> declareQueue()を呼び出し、メソッドはその上にキューパラメータを提供していないとき:
$queue = new AMQPQueue($channel); $queue->setFlags(AMQP_EXCLUSIVE); $queue->declareQueue();
この時点で、私たちは$ queue->のgetName()を渡すことができ、ランダムなキュー名が生成されています。== amq.gen-U0srCoW8TsaXjNh73pnVAw:それはこのようなものかもしれません。
第二ステップでは、消費者(消費者)が切断するとき、キューが削除されるべきです。我々は排他的なロゴを使用することができます。$queue->setFlags(AMQP_EXCLUSIVE);
第四に、結合
ファンアウト交換タイプと、我々が作成したキュー。今、私たちは私たちのキューにメッセージを送信するためにどのようにスイッチに指示する必要があります。交換と我々は結合(結合)を呼び出すキューとの関係。
$queue->bind($exchangeName, $queue->getName());
さて、ログは私たちのメッセージキューに追加されます切り替えます。
第五に、コードの統合
1、プロデューサー:send_log.php
<?PHP / * * * PHPのAMQP(RabbitMQの)デモ-3 * / $ exchangeName = 'ログ' ; $メッセージ = 空($のARGV [1])?'情報:Hello Worldの!' : ''。$ ARGVを [1 ]; $接続 = 新しい AMQPConnection(配列( 'ホスト' => '127.0.0.1'、 'ポート' => '5672'、 'バーチャルホスト' => '/'、 'ログイン' => 'ゲスト'、 'パスワード' = > 'ゲスト' )); $接続は、 - >(接続)または死ぬ( "!\ nはブローカーに接続できません" ); 取引所$ = 新しい新 AMQPExchange($チャンネル); $所 - >のsetName($ exchangeName ); $所 - > はsetType(AMQP_EX_TYPE_FANOUT); // それは知っているすべてのキューにメッセージを送信およそ $所 - > declareExchange(); $交流 - >(公開$メッセージを ''、); のvar_dump( "[X]送信$メッセージ " ); $接続 - >接続解除();
2.消費者:receive_logs.php
<?PHP / * * * PHPのAMQP(RabbitMQの)デモ-3 * / $ exchangeName = 'ログ' ; $接続 = 新しい AMQPConnection(配列( 'ホスト' => '127.0.0.1'、 'ポート' => '5672'、 'バーチャルホスト' => '/'、 'ログイン' => 'ゲスト'、 'パスワード' = > 'ゲスト' )); $接続は、 - >(接続)または死ぬ( "!\ nはブローカーに接続できません" ); $チャンネル = 新しい AMQPChannel($接続)。 $交換 = 新しい AMQPExchange($チャンネル); ); $所 - > はsetType(AMQP_EX_TYPE_FANOUT); // それが知っているすべてのキューにメッセージを送信 $所 - > declareExchange(); $キュー = 新新 AMQPQueue($チャンネル); $キュー - >でsetFlags(AMQP_EXCLUSIVEを)。// 消費者(消費者)が切断されたときに、キューが削除されるべきである $キュー - > declareQueue(); //はランダムなキュー名の作成 $キューを - >バインド($ exchangeName、 '' ); のvar_dump( '[*]キーを押し、Ctrl + Cを終了するためのメッセージを待っています。' ); しばらく(TRUE ){ $キュー- >消費( 'コールバック' )。 } $接続 - > 切断(); 関数 コールバック($封筒、$キュー){ $ MSG = $封筒 - > getBody(); var_dump( "[X]受信:"。$ MSG )。 $キュー - > NACK($封筒 - > getDeliveryTag()); }
だから我々は完了です。あなたはログをファイルに保存したい場合は、単にコンソール入力を開きます。
$ php receive_logs.php > logs_from_rabbit.log
あなたはログイン画面を表示したい場合は、新しいターミナルを開いて実行します。
$ php receive_logs.php
もちろん、ログを送信します。
$ php send_log.php