Stomp очередь

Stomp — это простой (потоковый) текстовый протокол сообщений, который предоставляет взаимозаменяемый формат подключения, позволяющий клиентам STOMP взаимодействовать с любым брокером сообщений STOMP. 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');
    }

}

Для совместимости с другими проектами компонент 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 этот вызов можно опустить
    }
}

Включение протокола stomp в rabbitmq

По умолчанию в rabbitmq протокол stomp не включен, необходимо выполнить следующую команду для его активации

rabbitmq-plugins enable rabbitmq_stomp

После активации порт stomp по умолчанию равен 61613.