PHP RabbitMQの最もシンプルなキューモードは、プロデューサーとコンシューマーから構成されています。以下はそのアーキテクチャ図です。 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