Простейший режим очереди PHP RabbitMQ состоит из производителя и потребителя, как показано на схеме ниже.
Пояснение:
P - это производитель, С - потребитель, и красный цвет обозначает очередь.
В настоящее время, при работе с RabbitMQ на PHP, официально рекомендуемым пакетом является php-amqplib.
1. Предварительный учебник
Пожалуйста, сначала ознакомьтесь с следующими разделами, чтобы понять соответствующие знания:
2. Установка зависимостей PHP
Используйте composer для установки:
composer require php-amqplib/php-amqplib
Примечание: последняя версия php-amqplib требует PHP 7.0 или выше.
Импорт пакета php-amqplib:
require_once __DIR__ . '/vendor/autoload.php';
3. Отправка сообщения
3.1. Создание подключения к RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
Пояснение параметров:
- new AMQPStreamConnection('адрес сервера RabbitMQ', номер порта, 'имя пользователя', 'пароль');
3.2. Создание канала
$channel = $connection->channel();
Большинство операций выполняется в канале.
3.3. Объявление очереди
$channel->queue_declare(
'tizi365_hello', // Имя очереди, должно быть уникальным
false,
true, // Долговечная ли очередь
false,
false
);
3.4. Отправка сообщения
// Определение объекта сообщения, параметр - это содержимое сообщения, которое нам нужно отправить
$msg = new AMQPMessage('Привет, мир!');
// Долговечно ли сообщение
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);
// Отправка сообщения
$channel->basic_publish(
$msg, // Объект сообщения
'', // Игнорировать обмен
'tizi365_hello' // Параметр маршрутизации, здесь используется имя очереди в качестве параметра маршрутизации
);
3.5. Завершение кода отправки сообщений на PHP
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Создание подключения
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Создание канала
$channel = $connection->channel();
// Объявление очереди
$channel->queue_declare('tizi365_hello', false, false, false, false);
// Определение объекта сообщения
$msg = new AMQPMessage('Привет, мир!');
// Отправка сообщения
$channel->basic_publish($msg, '', 'tizi365_hello');
echo " [x] Sent 'Привет, мир!'\n";
$channel->close();
$connection->close();
Сохраните в файл: send.php
4. Получение сообщений
Первые три шага получения сообщений (создание соединения с RabbitMQ, создание канала, объявление очереди) аналогичны отправке сообщений и соответствуют разделам 3.1, 3.2 и 3.3 соответственно.
Полный код потребителя выглядит следующим образом:
<?php require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// Создание соединения с RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Создание канала
$channel = $connection->channel();
// Объявление очереди
$channel->queue_declare('tizi365_hello', false, false, false, false);
echo " [*] Ожидание сообщений. Чтобы выйти, нажмите CTRL+C\n";
// Определение функции обработки сообщения (используется анонимная функция здесь)
$callback = function ($msg) {
// Логика обработки сообщения
echo ' [x] Получено ', $msg->body, "\n";
};
// Создание потребителя
$channel->basic_consume(
'tizi365_hello', // Имя очереди для потребления
'', // Тег потребителя, если игнорируется, генерируется уникальный идентификатор
false,
true, // Автоматическое подтверждение сообщения, т.е. автоматическое сообщение RabbitMQ о том, что сообщение успешно обработано
false,
false,
$callback // Функция обработки сообщения
);
// Если канал не закрыт, сохраняем процесс заблокированным, чтобы он не завершился
while ($channel->is_open()) {
$channel->wait();
}
// Освобождение ресурсов
$channel->close();
$connection->close();
Сохраните в файл: recv.php
5. Запуск демонстрации
Откройте два окна оболочки и выполните два скрипта отдельно:
php recv.php
php send.php