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 を新規作成します(クラス名は任意で、PSR-4規約に準拠すれば可)。

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