Filas de Tarefas para PHP: RabbitMQ, Gearman e Redis
Em aplicações web modernas em PHP, surge frequentemente a necessidade de executar operações longas ou que consomem muitos recursos sem bloquear o fluxo principal do usuário. Envio de campanhas de e-mail, geração de relatórios, processamento de imagens, trabalho com vídeo — todas essas tarefas são melhor executadas de forma assíncrona, em segundo plano. Para isso, existem as filas de tarefas (job queues) — mecanismos que permitem adiar a execução de uma tarefa e processá-la posteriormente com a ajuda de workers.
Neste artigo, vamos analisar três ferramentas populares para organizar filas de tarefas em PHP: RabbitMQ, Gearman e Redis. Você aprenderá em quais casos usá-las e verá exemplos de código.
Para que servem as filas de tarefas?
Principais vantagens do uso de filas:
- Assincronia — o usuário não espera a conclusão de uma operação pesada.
- Escalabilidade — você pode executar vários workers para processamento paralelo.
- Tolerância a falhas — se um worker falhar, a tarefa permanece na fila e será processada posteriormente.
- Separação de responsabilidades — o código de envio da tarefa e o código de processamento são fracamente acoplados.
1. RabbitMQ — poderoso broker de mensagens
RabbitMQ é um broker de mensagens completo, que suporta o protocolo AMQP. Ele oferece entrega garantida, roteamento, confirmações e muito mais. Adequado para sistemas complexos com alta carga.
Para trabalhar com RabbitMQ em PHP, utiliza-se a extensão php-amqplib.
Instalação
composer require php-amqplib/php-amqplibExemplo: envio de tarefa
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
$data = json_encode(['email' => 'user@example.com', 'subject' => 'Olá!']);$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');echo "Tarefa enviada para a fila";
$channel->close();$connection->close();Exemplo: worker (processador)
<?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);
$callback = function ($msg) { $data = json_decode($msg->body, true); echo "Enviando e-mail para {$data['email']} com assunto '{$data['subject']}'"; // Aqui o envio real do e-mail $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();}2. Gearman — sistema distribuído de tarefas
Gearman é especializado no processamento distribuído de tarefas. Ele permite chamar funções em servidores remotos ou em segundo plano. É ideal para arquitetura de microsserviços.
Para PHP, existe a extensão gearman (PECL).
Instalação
sudo apt install gearman-job-serverpecl install gearmanExemplo: cliente (envio de tarefa)
<?php$client = new GearmanClient();$client->addServer('127.0.0.1', 4730);
$result = $client->doBackground('send_email', json_encode([ 'email' => 'user@example.com', 'subject' => 'Olá!']));
echo "Tarefa enviada Também na biblioteca
Trabalho com datas em PHP: visão geral de bibliotecas e ferramentas
Geração de PDF em Java: visão geral das melhores bibliotecas (iText, Apache PDFBox, OpenPDF)
ORM para Swift (iOS/macOS): comparação e exemplos de uso
kotlinx-datetime para Kotlin: guia completo com exemplos práticos