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-amqplibExemplo: 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 Também na biblioteca
spdlog para C++: guia completo com exemplos
Cliente OAuth para TypeScript: integração de autorização em aplicações web
Internacionalização (i18n) em Kotlin: Guia Completo com Exemplos
Knex.js para JavaScript (Node.js): guia completo com exemplos práticos
ORM para Rust: comparação entre Diesel, SeaORM, SQLx e exemplos de código