Тест на вакансию

Работа с RabbitMQ в Docker-контейнере при помощи PHP

29 июля 2026 г.
29

Docker Compose файл

Создадим файл docker-compose.yml:
services:
  # Основной брокер сообщений RabbitMQ
  rabbitmq:
    image: rabbitmq:3.13-management-alpine
    container_name: rabbitmq
    hostname: rabbitmq
    ports:
      # Стандартный порт для подключения приложений
      - "5672:5672"
      # Веб-интерфейс управления (Management UI)
      - "15672:15672"
    environment:
      # Пользователь и пароль по умолчанию для входа в Management UI
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin
    volumes:
      # Сохраняем данные очередей между перезапусками
      - ./rabbitmq-data:/var/lib/rabbitmq
    # Небольшая задержка для гарантированного запуска
    healthcheck:
      test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
  # Веб-интерфейс для мониторинга очередей (альтернатива встроенному Management UI)
  # Опционально, но удобно для визуализации
  rabbitmq-mgmt:
    image: rabbitmq:3.13-management-alpine
    container_name: rabbitmq-mgmt
    ports:
      - "15673:15672"
    depends_on:
      rabbitmq:
        condition: service_healthy
    environment:
      RABBITMQ_DEFAULT_USER: admin
      RABBITMQ_DEFAULT_PASS: admin
    # Этот контейнер только для UI, он подключается к основному брокеру
    command: rabbitmq-server
Выполним команду в терминале из папки с docker-compose.yml. Флаг -d запускает контейнеры в фоновом режиме.
docker-compose up -d

Архитектура системы

RabbitMQ Broker

Это основной брокер сообщений. В нашем случае используется образ rabbitmq:3.13-management-alpine, который сразу включает веб-интерфейс управления.
  • Порт 5672: используется приложениями (PHP, Python и др.) для отправки и получения сообщений.
  • Порт 15672: предназначен для веб-интерфейса Management UI, где вы можете вручную создавать очереди, смотреть скорость обработки и управлять пользователями.

Management UI

Встроенный веб-интерфейс — мощный инструмент для администратора.
  • Адрес: http://localhost:15672
  • Логин/Пароль: admin/admin (заданы в переменных окружения)
  • Функции:
    • Просмотр всех очередей, обменников (exchanges) и связей (bindings).
    • Отправка тестовых сообщений прямо из интерфейса.
    • Мониторинг скорости потребления и накопления сообщений.

PHP скрипты

Для работы с RabbitMQ в PHP мы будем использовать официальную библиотеку php-amqplib. Установим её через Composer.

Создадим папку src и файл composer.json:
{
    "require": {
        "php-amqplib/php-amqplib": "^3.6"
    }
}
Перейдём в папку src и установим зависимости:
composer install

Producer (отправитель)

Создадим файл src/producer.php. Этот скрипт генерирует тестовые сообщения в формате JSON, имитирующие действия пользователя.
 
<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// Подключение к RabbitMQ
$connection = new AMQPStreamConnection(
    'localhost',
    5672,
    'admin',
    'admin',
    '/'
);

$channel = $connection->channel();

// Объявляем очередь. durable=true означает, что очередь сохранится при перезапуске брокера
$channel->queue_declare('json-queue', durable: true, auto_delete: false);

// Функция обратного вызова для подтверждения публикации (необязательно)
$callback = function ($msg) {
    echo " [x] Сообщение отправлено\n";
};

// Отправляем 10 тестовых сообщений
for ($i = 0; $i < 10; $i++) {
    $now = date('Y-m-d H:i:s');
    $guid = uniqid();

    $data = [
        'event_id' => $guid,
        'event_type' => 'user_action_php',
        'user_id' => $i + 1,
        'timestamp' => $now,
        'metadata' => [
            'browser' => 'Firefox',
            'os' => 'Linux'
        ]
    ];

    $jsonData = json_encode($data);
    $msg = new AMQPMessage($jsonData, [
        'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT, // сохранять на диск
    ]);

    $channel->basic_publish($msg, '', 'json-queue');
    echo " [x] Отправлено: ", $jsonData, "\n";
}

$channel->close();
$connection->close();

Consumer (получатель)

Создадим файл src/consumer.php. Он будет бесконечно слушать очередь и обрабатывать приходящие сообщения.
<?php

require_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\Connection\AMQPStreamConnection;

$connection = new AMQPStreamConnection(
    'localhost',
    5672,
    'admin',
    'admin',
    '/'
);

$channel = $connection->channel();

// Убеждаемся, что очередь существует
$channel->queue_declare('json-queue', durable: true, auto_delete: false);

echo " [*] Ожидание сообщений. Для выхода нажмите CTRL+C\n";

// Функция обработки полученного сообщения
$callback = function ($msg) {
    $data = json_decode($msg->body, true);
    if (json_last_error() === JSON_ERROR_NONE) {
        echo " [x] Получен JSON: ", print_r($data, true), "\n";
        // Здесь можно сохранить данные в БД, отправить email и т.д.
    } else {
        echo " [x] Ошибка декодирования JSON: ", $msg->body, "\n";
    }

    // Подтверждение обработки (ack) — сообщение удаляется из очереди
    $msg->ack();
};

// Настройка потребления: берем по 1 сообщению, подтверждаем вручную
$channel->basic_qos(null, 1, null);
$channel->basic_consume('json-queue', '', false, false, false, false, $callback);

// Бесконечный цикл ожидания
while ($channel->is_consuming()) {
    $channel->wait();
}

$channel->close();
$connection->close();

Запуск и тестирование

Выполним команды в разных терминалах.

Запустим Consumer (в первом терминале)

php src/consumer.php
Он запустится и будет ждать сообщений. Вывод будет таким:
[*] Ожидание сообщений. Для выхода нажмите CTRL+C

Запустим Producer (во втором терминале)

php src/producer.php
Вы увидите вывод об отправке сообщений, а в терминале консюмера — полученные данные.

Проверка через веб-интерфейс

Откроем в браузере http://localhost:15672, войдём под admin/admin. Перейдём на вкладку "Queues" — вы увидите очередь json-queue и количество сообщений в ней (Ready/Unacked).

Остановка

Чтобы остановить консюмера, нажмите CTRL+C. Чтобы остановить все контейнеры:
docker-compose down -v
Флаг -v удалит volume с данными, если нужно полностью очистить состояние.

Итог

Конфигурация позволяет запустить полнофункциональное окружение RabbitMQ для разработки и тестирования одной командой docker-compose up -d.

Использование стандартных портов (5672 для приложений и 15672 для UI) делает работу привычной и простой. Примеры на PHP с использованием библиотеки php-amqplib демонстрируют базовые, но рабочие шаблоны для создания отправителя и получателя сообщений.

Веб-интерфейс Management UI дает наглядное представление о работе очередей, что особенно полезно при отладке.

 
Поделиться: