Filas de Tarefas para PHP: RabbitMQ, Gearman e PhpAmqpLib

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Filas de Tarefas para PHP: RabbitMQ, Gearman e PhpAmqpLib

Em aplicações web modernas, a velocidade de resposta ao usuário é criticamente importante. Operações longas (envio de email, geração de PDF, processamento de imagens, parsing de dados) não devem bloquear o fluxo principal de execução. A solução para este problema são as filas de tarefas (job queues). Elas permitem delegar tarefas em segundo plano para workers que trabalham de forma assíncrona.

No ecossistema PHP, existem várias soluções maduras para organizar filas. Vamos considerar três ferramentas-chave: PhpAmqpLib (cliente para RabbitMQ), Gearman e o nativo RabbitMQ através do seu protocolo AMQP.



Por que usar filas de tarefas em PHP?

Cenário típico: um usuário se registra em um site. O sistema deve:

  • Salvar os dados no banco de dados
  • Enviar um email de boas-vindas
  • Criar um contrato em PDF
  • Iniciar uma verificação de spam

Sem fila, o usuário espera a conclusão de todas as operações. Com fila:

  • O processo principal salva os dados e envia a tarefa para a fila
  • O usuário recebe instantaneamente a resposta "Sucesso"
  • Workers em segundo plano processam as tarefas uma a uma

Isso melhora a UX e a estabilidade do sistema.



1. RabbitMQ e PhpAmqpLib

RabbitMQ é um poderoso broker de mensagens que suporta o protocolo AMQP 0-9-1. PhpAmqpLib é uma implementação puramente PHP de um cliente para trabalhar com RabbitMQ, sem extensões externas.



Instalação

composer require php-amqplib/php-amqplib


Exemplo: Envio de tarefa (Producer)

<?phprequire_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();

// Declara a fila (será criada se não existir)$channel->queue_declare('email_queue', false, true, false, false);

$data = json_encode([ 'to' => 'user@example.com', 'subject' => 'Boas-vindas', 'body' => 'Bem-vindo!']);

$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);$channel->basic_publish($msg, '', 'email_queue');

echo " [x] Enviado: $data";

$channel->close();$connection->close();


Exemplo: Worker (Consumer)

<?phprequire_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\\Connection\\AMQPStreamConnection;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();

$channel->queue_declare('email_queue', false, true, false, false);

echo " [*] Aguardando tarefas. Para sair, pressione CTRL+C";

$callback = function ($msg) { $data = json_decode($msg->body, true); // Simulação de envio de email echo " [x] Enviando email para {$data['to']}: {$data['subject']}"; sleep(2); // Simulação de trabalho echo " [x] Concluído"; $msg->ack(); // Confirmação de processamento};

$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);

while ($channel->is_consuming()) { $channel->wait();}


Vantagens: confiabilidade, suporte a roteamentos complexos (topics, headers), persistência de mensagens, clusterização.

Desvantagens: requer instalação e configuração do servidor RabbitMQ (Erlang, gerenciamento via interface web).



2. Gearman

Gearman é um sistema de tarefas distribuídas. Consiste em três componentes: cliente (envia tarefas), worker (executa), servidor (despachante). Funciona através de um protocolo binário.



Instalação

Primeiro, instale o servidor Gearman e a extensão PHP:

sudo apt-get install gearman-job-s                    

Recommendations