RabbitMQ — IO7 Framework
Внимание
Данная статья документации написана нейросетью. Возможны некоторые расхождения и неточность информации!
Обзор
IO\Queue\RabbitMQManager — менеджер для работы с RabbitMQ. Управляет подключениями, отправкой и получением сообщений. Реализован как singleton через static $instance.
Зависимость
{
"php-amqplib/php-amqplib": "^3.7"
}
Конфигурация
Через init()
\RabbitMQManager::init([
'host' => '127.0.0.1',
'port' => 5672,
'user' => 'guest',
'password' => 'guest',
'vhost' => '/',
]);
Параметры
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
host | string | — | Да | Хост RabbitMQ |
port | int | 5672 | Нет | Порт |
user | string | — | Да | Пользователь |
password | string | — | Да | Пароль |
vhost | string | '/' | Нет | Virtual host |
Методы
init(array $config): self
Инициализирует синглтон с заданной конфигурацией. При повторном вызове возвращает уже созданный экземпляр.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$config | array<string, mixed> | — | Да | Массив конфигурации подключения |
| Возврат | self | Экземпляр менеджера |
$manager = RabbitMQManager::init([
'host' => 'localhost',
'user' => 'guest',
'password' => 'guest',
]);
getInstance(): self
Возвращает текущий экземпляр синглтона.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
| Возврат | self | Экземпляр менеджера | ||
| Исключение | \Exception | Если менеджер не был инициализирован |
$manager = RabbitMQManager::getInstance();
$manager->publish('test_queue', 'hello');
publish(string $queue, $message, string $exchange = '', int $deliveryMode = 2): bool
Отправить сообщение в очередь.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$queue | string | — | Да | Имя очереди |
$message | string|array | — | Да | Текстовое сообщение или массив (сериализуется в JSON) |
$exchange | string | '' | Нет | Имя exchange (по умолчанию '') |
$deliveryMode | int | 2 | Нет | Режим доставки: 1=непостоянный, 2=постоянный (по умолчанию 2) |
| Возврат | bool | Всегда true при успешной отправке |
RabbitMQManager::getInstance()->publish('orders', ['order_id' => 123, 'status' => 'new']);
RabbitMQManager::getInstance()->publish('logs', 'error occurred', '', 1);
publishDelayed(string $queue, $message, int $delayMs = 5000): bool
Отправить сообщение с задержкой через dead-letter exchange.
Создаёт промежуточную очередь с суффиксом .dlq, которая после истечения TTL перенаправляет сообщение в целевую очередь.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$queue | string | — | Да | Имя целевой очереди |
$message | string|array | — | Да | Сообщение |
$delayMs | int | 5000 | Нет | Задержка в миллисекундах (по умолчанию 5000) |
| Возврат | bool | Всегда true |
RabbitMQManager::getInstance()->publishDelayed('tasks', ['job' => 'cleanup'], 10000);
consume(string $queue, callable $callback, bool $autoAck = false): void
Получить сообщение из очереди с обработкой через callback. Блокирующий вызов.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$queue | string | — | Да | Имя очереди |
$callback | callable(array<string, mixed>): bool|null | — | Да | Функция-обработчик |
$autoAck | bool | false | Нет | Автоматическое подтверждение (по умолчанию false) |
RabbitMQManager::getInstance()->consume('orders', function (array $data): bool {
echo "Получен заказ: " . $data['order_id'];
return true;
});
get(string $queue, bool $autoAck = true): ?array
Получить одно сообщение из очереди (non-blocking).
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$queue | string | — | Да | Имя очереди |
$autoAck | bool | true | Нет | Автоматическое подтверждение (по умолчанию true) |
| Возврат | array|null | Декодированное тело сообщения или null |
$message = RabbitMQManager::getInstance()->get('notifications');
if ($message !== null) {
echo $message['text'];
}
rpcClient(string $queue, $message, int $timeout = 30): ?array
Выполнить RPC-запрос и получить ответ.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$queue | string | — | Да | Имя очереди |
$message | string|array | — | Да | Сообщение |
$timeout | int | 30 | Нет | Таймаут в секундах (по умолчанию 30) |
| Возврат | array|null | Ответ сервера или null при таймауте |
$result = RabbitMQManager::getInstance()->rpcClient(
'math_queue',
['operation' => 'add', 'a' => 2, 'b' => 3],
10
);
// $result = ['result' => 5]
rpcServer(string $queue, callable $callback): void
Запустить RPC-сервер, обрабатывающий запросы из очереди. Блокирующий вызов.
| Параметр | Тип | Значение по умолчанию | Обязателен | Описание |
|---|---|---|---|---|
$queue | string | — | Да | Имя очереди |
$callback | callable(array<string, mixed>): mixed | — | Да | Функция-обработчик |
RabbitMQManager::getInstance()->rpcServer('math_queue', function (array $request): array {
return ['result' => $request['a'] + $request['b']];
});
close(): void
Закрыть канал и соединение с RabbitMQ.
RabbitMQManager::getInstance()->close();
Примеры
Простая очередь
// Producer (веб-приложение)
\RabbitMQManager::init(['host' => 'localhost', 'user' => 'guest', 'password' => 'guest']);
\RabbitMQManager::getInstance()->publish('email_queue', [
'to' => 'user@example.com',
'subject' => 'Welcome!',
'body' => 'Hello world!',
]);
// Consumer (отдельный процесс)
\RabbitMQManager::init(['host' => 'localhost', 'user' => 'guest', 'password' => 'guest']);
\RabbitMQManager::getInstance()->consume('email_queue', function (array $data): bool {
mail($data['to'], $data['subject'], $data['body']);
return true;
});
Отложенная обработка
// Планирование задачи
\RabbitMQManager::getInstance()->publishDelayed('cleanup', [
'type' => 'old_sessions',
], 3600000);
// Воркер (отдельный процесс)
\RabbitMQManager::getInstance()->consume('cleanup', function (array $data): bool {
if ($data['type'] === 'old_sessions') {
cleanupOldSessions();
}
return true;
});
RPC-вызов
// Сервер (отдельный процесс)
\RabbitMQManager::getInstance()->rpcServer('image_resize', function (array $request): array {
$resized = resizeImage($request['path'], $request['width']);
return ['resized_path' => $resized];
});
// Клиент (веб-приложение)
$result = \RabbitMQManager::getInstance()->rpcClient('image_resize', [
'path' => '/uploads/photo.jpg',
'width' => 800,
], 30);
echo $result['resized_path'];