PHP RabbitMQの最もシンプルなキューモードは、プロデューサーとコンシューマーから構成されています。以下はそのアーキテクチャ図です。
説明:
Pはプロデューサーを、Cはコンシューマーを、赤色はキューを表します。
現在、PHPでRabbitMQを操作する際に、公式に推奨されているパッケージはphp-amqplibです。
1. チュートリアルの前に
関連する知識を理解するために、まず以下のセクションを読んでください:
2. PHP依存関係のインストール
Composerを使用してインストールしてください:
composer require php-amqplib/php-amqplib
注意: php-amqplibの最新バージョンは、PHP 7.0以上が必要です。
php-amqplibパッケージをインポートします:
require_once __DIR__ . '/vendor/autoload.php';
3. メッセージの送信
3.1. RabbitMQ接続の作成
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
パラメータの説明:
- new AMQPStreamConnection('RabbitMQサーバーアドレス', ポート番号, 'ユーザー名', 'パスワード');
3.2. チャンネルの作成
$channel = $connection->channel();
ほとんどの操作はチャンネルで完了します。
3.3. キューの宣言
$channel->queue_declare(
'tizi365_hello', // キュー名、一意である必要があります
false,
true, // 耐久性の有無
false,
false
);
3.4. メッセージの送信
// メッセージオブジェクトを定義します。パラメータは送信するメッセージの内容です
$msg = new AMQPMessage('Hello World!');
// メッセージの耐久性
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);
// メッセージの送信
$channel->basic_publish(
$msg, // メッセージオブジェクト
'', // 交換を無視
'tizi365_hello' // ルーティングパラメーター。ここではキュー名をルーティングパラメーターとして使用します
);
3.5. PHPメッセージ送信コードの完成
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// 接続の作成
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// チャンネルの作成
$channel = $connection->channel();
// キューの宣言
$channel->queue_declare('tizi365_hello', false, false, false, false);
// メッセージオブジェクトを定義
$msg = new AMQPMessage('Hello World!');
// メッセージの送信
$channel->basic_publish($msg, '', 'tizi365_hello');
echo " [x] Sent 'Hello World!'\n";
$channel->close();
$connection->close();
ファイルに保存:send.php
4. メッセージの受信
メッセージの受信の最初の3つのステップ(RabbitMQ接続の作成、チャネルの作成、キューの宣言)は、メッセージの送信に対応しており、それぞれセクション3.1、3.2、および3.3に対応しています。
完全なコンシューマーのコードは以下の通りです:
<?php require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// RabbitMQ接続の作成
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// チャネルの作成
$channel = $connection->channel();
// キューの宣言
$channel->queue_declare('tizi365_hello', false, false, false, false);
echo " [*] メッセージの待機中。終了するにはCTRL+Cを押してください\n";
// メッセージハンドリング関数の定義(ここでは無名関数を使用)
$callback = function ($msg) {
// メッセージのハンドリングロジック
echo ' [x] 受信したメッセージ: ', $msg->body, "\n";
};
// コンシューマーの作成
$channel->basic_consume(
'tizi365_hello', // 受信するキューの名前
'', // コンシューマータグ(無視する場合、一意のIDが生成されます)
false,
true, // メッセージを自動的に確認するかどうか、つまり、RabbitMQにメッセージが正常に処理されたことを自動的に通知するかどうか
false,
false,
$callback // メッセージハンドリング関数
);
// チャネルが閉じられていない場合、プロセスをブロックして終了しないようにする
while ($channel->is_open()) {
$channel->wait();
}
// リソースの解放
$channel->close();
$connection->close();
ファイルに保存:recv.php
5. デモの実行
2つのシェルウィンドウを開き、それぞれのスクリプトを別々に実行してください:
php recv.php
php send.php