Простейший режим очереди PHP RabbitMQ состоит из производителя и потребителя, как показано на схеме ниже. 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