O modo de fila mais simples do PHP RabbitMQ consiste de um produtor e um consumidor, como mostrado na arquitetura abaixo. PHP RabbitMQ 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