1. Pre-tutorial

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

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.