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です。