Symfoware

Symfowareについての考察blog

RabbitMQにPHPクライアント(php-amqplib)からメッセージを送信、受信する

RabbitMQをインストール。
JavaやPythonクライアントからメッセージの送受信を行ってみました。
RabbitMQにJavaクライアントからメッセージを送信、受信する
RabbitMQにPythonクライアント(pika)からメッセージを送信、受信する


PHPでもメッセージの送受信を行ってみます。
こちらを参考にしました。
http://www.rabbitmq.com/tutorials/tutorial-one-php.html



Composerのインストール



php-amqplibというライブラリを使用するのですが、最近はComposerを使用して
インストールするのが作法のようです。

PHPフレームワーク「Laravel」をDebian 7 + nginx + php-fpmで動作させる
こちらを参考にComposerをインストールします。

ざっくり手順だけ。

php5-cliとcurlのインストール。


# apt-get -y install php5-cli curl




composerの取得とビルド
どこからでも使えるよう、composer.pharを/usr/local/bin/composerに移動。


# curl -sS https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer




バージョンを表示して動作確認。


# composer -V
Composer version a8adbfeb9fc7861deade782938222714168a22a8 2014-09-05 16:28:50








php-amqplibのインストール



php-amqplibというライブラリをインストールします。
php-amqplib


/var/www/rabbitというディレクトリを作成。
ここにサンプルプログラムを作成することにしました。

/var/www/rabbit/composer.jsonというファイルを作成し、
以下の内容を記載します。


  1. {
  2. "require": {
  3.      "videlalvaro/php-amqplib": "2.2.*"
  4. }
  5. }




/var/www/rabbit/に移動。
composerコマンドでインストールします。


# cd /var/www/rabbit/
# composer install




ファイルのダウンロードが自動的に行われ、こんなフォルダ階層が作成されます。

470_01.png





送信のサンプル



送信のサンプルはこんな感じになりました。

・send.php


  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. use PhpAmqpLib\Connection\AMQPConnection;
  4. use PhpAmqpLib\Message\AMQPMessage;
  5. $connection = new AMQPConnection('192.168.1.12', 5672, 'symfo', 'P@ssw0rd');
  6. $channel = $connection->channel();
  7. $channel->queue_declare('hello', false, false, false, false);
  8. $msg = new AMQPMessage('Hello World!');
  9. $channel->basic_publish($msg, '', 'hello');
  10. echo " [x] Sent 'Hello World!'\n";
  11. $channel->close();
  12. $connection->close();



※ユーザー名、パスワードを明示していますが、通常はguest、guestでOKだと思います。



受信のサンプルはこんな感じです。
Pythonの時と同じく、コールバック関数を指定する形式ですね。

・recv.php

  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. use PhpAmqpLib\Connection\AMQPConnection;
  4. $connection = new AMQPConnection('192.168.1.12', 5672, 'symfo', 'P@ssw0rd');
  5. $channel = $connection->channel();
  6. $channel->queue_declare('hello', false, false, false, false);
  7. echo ' [*] Waiting for messages. To exit press CTRL+C',"\n";
  8. $callback = function($msg) {
  9. echo " [x] Received ", $msg->body, "\n";
  10. };
  11. $channel->basic_consume('hello', '', false, true, false, false, $callback);
  12. while(count($channel->callbacks)) {
  13.     $channel->wait();
  14. }




コマンドで


# php recv.php



を実行し、メッセージを待ち受けておきます。

ブラウザでhttp://[サーバーIP]/rabbit/send.phpにアクセスするたびに、
コンソールに受信メッセージが表示されるはずです。


# php recv.php
[*] Waiting for messages. To exit press CTRL+C
[x] Received Hello World!
[x] Received Hello World!
[x] Received Hello World!
[x] Received Hello World!








キューの永続化



この状態でキューを登録すると、RabbitMQサーバーを再起動した時、
キューの内容が失われます。
永続化するコードは以下の通り。


  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. use PhpAmqpLib\Connection\AMQPConnection;
  4. use PhpAmqpLib\Message\AMQPMessage;
  5. $connection = new AMQPConnection('192.168.1.12', 5672, 'symfo', 'P@ssw0rd');
  6. $channel = $connection->channel();
  7. $channel->queue_declare('hello', false, true, false, false);
  8. $properties = array('content_type' => 'text/plain', 'delivery_mode' => 2);
  9. $msg = new AMQPMessage('Hello World!', $properties);
  10. $channel->basic_publish($msg, '', 'hello');
  11. echo " [x] Sent 'Hello World!'\n";
  12. $channel->close();
  13. $connection->close();




queue_declareの第三引数をtrueに。
AMQPMessageのコンストラクタの第二引数に、
'delivery_mode' => 2
を指定したオプションを渡して、永続化を指定します。


取り出す側もqueue_declareの第三引数をtrueに変更しておきます。


  1. <?php
  2. require_once __DIR__ . '/vendor/autoload.php';
  3. use PhpAmqpLib\Connection\AMQPConnection;
  4. $connection = new AMQPConnection('192.168.1.12', 5672, 'symfo', 'P@ssw0rd');
  5. $channel = $connection->channel();
  6. $channel->queue_declare('hello', false, true, false, false);
  7. echo ' [*] Waiting for messages. To exit press CTRL+C',"\n";
  8. $callback = function($msg) {
  9. echo " [x] Received ", $msg->body, "\n";
  10. };
  11. $channel->basic_consume('hello', '', false, true, false, false, $callback);
  12. while(count($channel->callbacks)) {
  13.     $channel->wait();
  14. }




これでRabbitMQサーバーをリブートしても、キューが失われなくなりました。
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/09/07(日) 17:04:10|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<RabbitMQにMessagePackのデータをキューとして登録する | ホーム | RabbitMQにPythonクライアント(pika)からメッセージを送信、受信する>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1490-16341d8c
この記事にトラックバックする(FC2ブログユーザー)