O modo de fila mais simples do PHP RabbitMQ consiste de um produtor e um consumidor, como mostrado na arquitetura abaixo.
Explicação:
P representa o produtor, C representa o consumidor e vermelho representa a fila.
Atualmente, ao operar o RabbitMQ com PHP, o pacote recomendado pela equipe oficial é o php-amqplib.
1. Pré-tutorial
Por favor, leia as seguintes seções primeiro para entender o conhecimento relevante:
2. Instalar Dependências do PHP
Use o composer para instalar:
composer require php-amqplib/php-amqplib
Observação: A versão mais recente do php-amqplib requer PHP 7.0 ou superior.
Importe o pacote php-amqplib:
require_once __DIR__ . '/vendor/autoload.php';
3. Enviar mensagem
3.1. Criar conexão com RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
Explicação dos parâmetros:
- new AMQPStreamConnection('endereço do servidor RabbitMQ', número da porta, 'nome de usuário', 'senha');
3.2. Criar Canal
$channel = $connection->channel();
A maioria das operações são concluídas no canal.
3.3. Declarar fila
$channel->queue_declare(
'tizi365_hello', // Nome da fila, deve ser único
false,
true, // Se é durável
false,
false
);
3.4. Enviar mensagem
// Define um objeto de mensagem, o parâmetro é o conteúdo da mensagem que precisamos enviar
$msg = new AMQPMessage('Olá Mundo!');
// Se a mensagem é durável
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);
// Enviar mensagem
$channel->basic_publish(
$msg, // Objeto de mensagem
'', // Ignorar a troca
'tizi365_hello' // Parâmetro de roteamento, use o nome da fila como parâmetro de roteamento aqui
);
3.5. Código completo de envio de mensagem PHP
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Criar conexão
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Criar canal
$channel = $connection->channel();
// Declarar fila
$channel->queue_declare('tizi365_hello', false, false, false, false);
// Definir objeto mensagem
$msg = new AMQPMessage('Olá Mundo!');
// Enviar mensagem
$channel->basic_publish($msg, '', 'tizi365_hello');
echo " [x] Enviado 'Olá Mundo!'\n";
$channel->close();
$connection->close();
Salvar como arquivo: send.php
4. Consumir Mensagens
Os primeiros três passos de consumo de mensagens (criar uma conexão RabbitMQ, criar um canal, declarar uma fila) são os mesmos que enviar mensagens, correspondendo às seções 3.1, 3.2 e 3.3, respectivamente.
O código completo do consumidor é o seguinte:
<?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 fila
$channel->queue_declare('tizi365_hello', false, false, false, false);
echo " [*] Aguardando por mensagens. Pressione CTRL+C para sair\n";
// Definir a função de tratamento de mensagens (usando uma função anônima aqui)
$callback = function ($msg) {
// Lógica de tratamento de mensagens
echo ' [x] Recebido ', $msg->body, "\n";
};
// Criar um consumidor
$channel->basic_consume(
'tizi365_hello', // Nome da fila a ser consumida
'', // Tag do consumidor, se ignorado, um ID único é gerado
false,
true, // Se deve automaticamente reconhecer a mensagem, ou seja, informar automaticamente ao RabbitMQ que a mensagem foi processada com sucesso
false,
false,
$callback // Função de tratamento de mensagens
);
// Se o canal não estiver fechado, manter o processo bloqueado para evitar a saída
while ($channel->is_open()) {
$channel->wait();
}
// Liberar recursos
$channel->close();
$connection->close();
Salvar em arquivo: recv.php
5. Executando o Demo
Abra duas janelas do terminal e execute os dois scripts separadamente:
php recv.php
php send.php