1. Pré-tutorial

Por favor, leia as seguintes seções primeiro para entender o conhecimento relevante:

2. Definir Exchange de Tópicos

// Declarar a exchange
$channel->exchange_declare(
    'tizi365.topic', // Nome da exchange, precisa ser único, não pode ser repetido
    'topic', // Tipo de exchange
    false,
    false, // Se é durável
    false
);

Nota: Tanto os produtores quanto os consumidores de mensagens precisam de exchanges.

3. Enviar Mensagem

Nós enviamos mensagens para a exchange, e a exchange entrega as mensagens para a fila correspondente com base nas regras de roteamento.

<?php

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

// Criação de uma conexão rabbitmq
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Criar Canal
$channel = $connection->channel();

// Declarar a exchange
$channel->exchange_declare(
    'tizi365.topic', // Nome da exchange, precisa ser único, não pode ser repetido
    'topic', // Tipo de exchange
    false,
    false, // Se é durável
    false
);

// Objeto de mensagem, o parâmetro é o conteúdo da mensagem
$msg = new AMQPMessage("olá tizi365.com");

// Enviar mensagem
// Observe o terceiro parâmetro, o parâmetro de roteamento
$channel->basic_publish(
    $msg, // Objeto de mensagem
    'tizi365.topic', // Nome da exchange
    "www.tizi365.com" // Parâmetro de roteamento, pode ser definido arbitrariamente de acordo com os requisitos
);

echo ' [x] Enviado ', $msg->getBody(), "\n";

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

4. Receber Mensagem

4.1. Definir Fila e Vincular Exchange

Para consumir mensagens da fila, você precisa primeiro definir uma fila e, em seguida, vinculá-la à exchange de destino.

// Declarar uma fila anônima
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// Vincular a fila à exchange especificada
$channel->queue_bind(
    $queue_name, // Nome da fila
    'tizi365.topic', // Nome da exchange
    "*.tizi365.com" // Parâmetro de roteamento de vinculação, aqui usando o curinga * (asterisco), que pode corresponder a uma única palavra

Nota: Todos os parâmetros de roteamento usam o curinga * (asterisco), que pode corresponder a uma única palavra. Se alterado para # (sustenido), pode corresponder a múltiplas palavras.

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

// Criar uma conexão rabbitmq
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Criar um canal
$channel = $connection->channel();

// Declarar uma exchange
$channel->exchange_declare(
    'tizi365.topic', // Nome da exchange, precisa ser único e não pode se repetir
    'topic', // Tipo da exchange
    false,
    false, // Se é durável
    false
);

// Declarar uma fila anônima
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// Vincular a fila à exchange especificada
$channel->queue_bind(
    $queue_name, // Nome da fila
    'tizi365.topic', // Nome da exchange
    "*.tizi365.com" // Chave de roteamento de vinculação, usando o curinga * aqui, que pode corresponder a uma única palavra
);

echo " [*] Aguardando mensagem. Pressione CTRL+C para sair\n";

// Definir a função de manipulação de mensagens (usando uma função anônima aqui)
$callback = function ($msg) {
    // Lógica de processamento de mensagens
    echo ' [x] ', $msg->body, "\n";
};

// Criar um consumidor
$channel->basic_consume(
    $queue_name, // Nome da fila para consumir
    '', // Tag do consumidor, se for ignorado, um ID único será gerado automaticamente
    false,
    true, // Se deve reconhecer automaticamente a mensagem, ou seja, informar automaticamente ao rabbitmq que a mensagem foi processada com sucesso
    false,
    false,
    $callback // Função de manipulação de mensagens
);

// Se o canal não estiver fechado, mantenha o bloqueio do processo para evitar a saída do processo
while ($channel->is_open()) {
    $channel->wait();
}

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

Como o parâmetro de roteamento definido ao vincular a exchange é *.tizi365.com, ele corresponde ao parâmetro de roteamento da mensagem (www.tizi365.com), portanto a mensagem pode ser recebida.