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.