1. Pre-tutorial
Por favor, lee primero las siguientes secciones para comprender el conocimiento relevante
- Conceptos básicos de RabbitMQ
- Principio del patrón de temas de RabbitMQ
- Capítulo de inicio rápido de RabbitMQ para PHP (requerido, ya que los capítulos posteriores no duplicarán el código, solo mostrarán el código clave)
- Capítulo de patrón de publicación/suscripción de RabbitMQ para PHP (requerido, ya que el código es casi el mismo, solo cambian el tipo de intercambio y los parámetros de enrutamiento)
2. Definir un intercambio de temas
// Declarar el intercambio
$channel->exchange_declare(
'tizi365.topic', // Nombre del intercambio, debe ser único, no puede repetirse
'topic', // Tipo de intercambio
false,
false, // Si es duradero
false
);
Nota: Tanto los productores como los consumidores de mensajes necesitan intercambios.
3. Enviar mensaje
Enviamos mensajes al intercambio, y el intercambio entrega los mensajes a la cola correspondiente según las reglas de enrutamiento.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Crear una conexión a RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Crear un canal
$channel = $connection->channel();
// Declarar el intercambio
$channel->exchange_declare(
'tizi365.topic', // Nombre del intercambio, debe ser único, no puede repetirse
'topic', // Tipo de intercambio
false,
false, // Si es duradero
false
);
// Objeto de mensaje, el parámetro es el contenido del mensaje
$msg = new AMQPMessage("hola tizi365.com");
// Enviar mensaje
// Nota el tercer parámetro, el parámetro de enrutamiento
$channel->basic_publish(
$msg, // Objeto de mensaje
'tizi365.topic', // Nombre del intercambio
"www.tizi365.com" // Parámetro de enrutamiento, puede definirse arbitrariamente según los requisitos
);
echo ' [x] Enviado ', $msg->getBody(), "\n";
// Liberar recursos
$channel->close();
$connection->close();
4. Recibir mensaje
4.1. Definir cola y enlazar intercambio
Para consumir mensajes de la cola, primero necesitas definir una cola y luego enlazarla al intercambio de destino.
// Definir una cola anónima
list($nombre_cola, ,) = $channel->queue_declare("", false, false, true, false);
// Enlazar la cola al intercambio especificado
$channel->queue_bind(
$nombre_cola, // Nombre de la cola
'tizi365.topic', // Nombre del intercambio
"*.tizi365.com" // Parámetro de enlace de enrutamiento, aquí se utiliza el comodín * (asterisco), que puede coincidir con una sola palabra
Nota: Todos los parámetros de enrutamiento utilizan el comodín * (asterisco), que puede coincidir con una sola palabra. Si se cambia a # (almohadilla), puede coincidir con varias palabras.
<?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 un intercambio
$channel->exchange_declare(
'tizi365.topic', // Nombre del intercambio, debe ser único y no puede repetirse
'topic', // Tipo de intercambio
false,
false, // Si es duradero
false
);
// Definir una cola anónima
list($nombre_cola, ,) = $channel->queue_declare("", false, false, true, false);
// Enlazar la cola al intercambio especificado
$channel->queue_bind(
$nombre_cola, // Nombre de la cola
'tizi365.topic', // Nombre del intercambio
"*.tizi365.com" // Clave de enrutamiento de enlace, utilizando el comodín * aquí, que puede coincidir con una sola palabra
);
echo " [*] Esperando mensaje. Presione CTRL+C para salir\n";
// Definir la función de manejo de mensajes (utilizando una función anónima aquí)
$callback = function ($msg) {
// Lógica de procesamiento de mensajes
echo ' [x] ', $msg->body, "\n";
};
// Crear un consumidor
$channel->basic_consume(
$nombre_cola, // Nombre de la cola para consumir
'', // Etiqueta del consumidor, si se omite, se generará automáticamente un ID único
false,
true, // Si se debe reconocer automáticamente el mensaje, es decir, informar 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, seguir bloqueando el proceso para evitar la salida del proceso
while ($channel->is_open()) {
$channel->wait();
}
// Liberar recursos
$channel->close();
$connection->close();
Debido a que el parámetro de enrutamiento establecido al enlazar el intercambio es *.tizi365.com, coincide con el parámetro de enrutamiento del mensaje (www.tizi365.com), por lo que el mensaje puede ser recibido.