1. Pré-tutorial
Por favor, leia as seguintes seções primeiro para entender o conhecimento relevante:
- Conceitos Básicos do RabbitMQ
- Princípio do Padrão de Tópicos do RabbitMQ
- Capítulo Inicial Rápido do RabbitMQ para PHP (necessário, pois os capítulos subsequentes não duplicarão o código, apenas mostrarão o código chave)
- Capítulo de Padrão de Publicação/Assinatura do RabbitMQ para PHP (necessário, pois o código é quase o mesmo, apenas o tipo de exchange e os parâmetros de roteamento são diferentes)
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.