El modo de cola más simple de PHP RabbitMQ consiste en un productor y un consumidor, como se muestra en la arquitectura a continuación. PHP RabbitMQ Explicación: P representa el productor, C representa el consumidor, y el rojo representa la cola.

Actualmente, al operar RabbitMQ con PHP, el paquete recomendado por el oficial es php-amqplib.

1. Pre-tutorial

Por favor, lee primero las siguientes secciones para entender el conocimiento relevante:

2. Instalar dependencias de PHP

Usa composer para instalar:

composer require php-amqplib/php-amqplib

Nota: La última versión de php-amqplib requiere PHP 7.0 o superior.

Importa el paquete php-amqplib:

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

3. Enviar mensaje

3.1. Crear conexión RabbitMQ

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

Explicación de parámetros:

  • new AMQPStreamConnection('dirección del servidor de RabbitMQ', número de puerto, 'nombre de usuario', 'contraseña');

3.2. Crear canal

$channel = $connection->channel();

La mayoría de las operaciones se completan en el canal.

3.3. Declarar cola

$channel->queue_declare('tizi365_hello',  // Nombre de la cola, debe ser único
false,
true, // Si es duradera
false,
false
);

3.4. Enviar mensaje

// Define un objeto de mensaje, el parámetro es el contenido del mensaje que necesitamos enviar
$msg = new AMQPMessage('¡Hola Mundo!');
// Si el mensaje es duradero
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);

// Enviar mensaje
$channel->basic_publish(
$msg, // Objeto de mensaje
'',   // Ignorar el intercambio
'tizi365_hello' // Parámetro de enrutamiento, aquí se utiliza el nombre de la cola como parámetro de enrutamiento
);

3.5. Código completo de envío de mensajes en PHP

<?php 
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// Crear conexión
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Crear canal
$channel = $connection->channel();
// Declarar cola
$channel->queue_declare('tizi365_hello', false, false, false, false);

// Definir objeto de mensaje
$msg = new AMQPMessage('¡Hola Mundo!');
// Enviar mensaje
$channel->basic_publish($msg, '', 'tizi365_hello');

echo " [x] Enviado '¡Hola Mundo!'\n";

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

Guardar en el archivo: send.php

4. Consumiendo Mensajes

Los primeros tres pasos para la consumición de mensajes (crear una conexión RabbitMQ, crear un canal, declarar una cola) son iguales al envío de mensajes, correspondiendo a las secciones 3.1, 3.2 y 3.3, respectivamente.

El código completo del consumidor es el siguiente:

<?php require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

// Crear una conexión RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Crear un canal
$channel = $connection->channel();

// Declarar una cola
$channel->queue_declare('tizi365_hello', false, false, false, false);

echo " [*] Esperando mensajes. Para salir, presiona CTRL+C\n";

// Definir la función de manejo de mensajes (usando una función anónima aquí)
$callback = function ($msg) {
    // Lógica de manejo de mensajes
    echo ' [x] Recibido ', $msg->body, "\n";
};

// Crear un consumidor
$channel->basic_consume(
    'tizi365_hello', // Nombre de la cola a ser consumida
    '', // Etiqueta del consumidor, si se ignora, se genera un ID único
    false,
    true, // Si se debe reconocer automáticamente el mensaje, es decir, decir automáticamente a RabbitMQ que el mensaje ha sido procesado con éxito
    false,
    false,
    $callback // Función de manejo de mensajes
);

// Si el canal no está cerrado, mantener el proceso bloqueado para evitar que salga
while ($channel->is_open()) {
    $channel->wait();
}

// Liberar recursos
$channel->close();
$connection->close();

Guardar en el archivo: recv.php

5. Ejecutando la Demo

Abrir dos ventanas de terminal y ejecutar los dos scripts por separado:

php recv.php

php send.php