Stompキュー
Stompはシンプル(ストリーム)テキスト指向メッセージプロトコルであり、STOMPクライアントが任意のSTOMPメッセージブローカー(Broker)と相互運用できる接続フォーマットを提供します。workerman/stompはStompクライアントを実装しており、主にRabbitMQ、Apollo、ActiveMQなどのメッセージキューシナリオに使用されます。
インストール
composer require webman/stomp
設定
設定ファイルは config/plugin/webman/stomp
の下にあります。
メッセージを送信
<?php
namespace app\controller;
use support\Request;
use Webman\Stomp\Client;
class Index
{
public function queue(Request $request)
{
// キュー
$queue = 'examples';
// データ(配列を渡すときは、自分でシリアライズする必要があります。例えば、json_encode、serializeなどを使用)
$data = json_encode(['to' => 'tom@gmail.com', 'content' => 'hello']);
// 送信を実行
Client::send($queue, $data);
return response('redis queue test');
}
}
他のプロジェクトとの互換性を維持するために、Stompコンポーネントは自動シリアライズ/デシリアライズ機能を提供していません。配列データを送信する場合は、自分でシリアライズし、受信時に自分でデシリアライズする必要があります。
メッセージを受信
新しく app/queue/stomp/MyMailSend.php
を作成します(クラス名は任意で、psr4規則に従う必要があります)。
<?php
namespace app\queue\stomp;
use Workerman\Stomp\AckResolver;
use Webman\Stomp\Consumer;
class MyMailSend implements Consumer
{
// キュー名
public $queue = 'examples';
// 接続名、stomp.php内の接続に対応
public $connection = 'default';
// 値が client の場合は $ack_resolver->ack() を呼び出してサーバーに成功を通知する必要があります
// 値が auto の場合は $ack_resolver->ack() を呼び出す必要はありません
public $ack = 'auto';
// 消費
public function consume($data, AckResolver $ack_resolver = null)
{
// データが配列の場合、自分でデシリアライズする必要があります
var_export(json_decode($data, true)); // 出力 ['to' => 'tom@gmail.com', 'content' => 'hello']
// サーバーに成功を通知
$ack_resolver->ack(); // ackが auto の場合はこの呼び出しを省略できます
}
}
rabbitmqでstompプロトコルを有効にする
rabbitmqはデフォルトではstompプロトコルが無効になっているため、以下のコマンドを実行して有効にする必要があります。
rabbitmq-plugins enable rabbitmq_stomp
有効にした後、stompのポートはデフォルトで61613です。