Filas de tarefas para PHP: RabbitMQ, Beanstalkd e Gearman
Em aplicações web modernas, surge frequentemente a necessidade de executar operações longas ou que consomem muitos recursos de forma assíncrona, sem fazer o usuário esperar pela resposta. Exemplos típicos: envio de campanhas de e-mail, geração de relatórios, processamento de imagens, interação com APIs externas. Para resolver esses problemas em PHP, são usadas filas de tarefas (job queues). Elas permitem separar a lógica da requisição do processamento em segundo plano, aumentando a capacidade de resposta da interface e a escalabilidade do sistema.
Neste artigo, vamos analisar detalhadamente três ferramentas populares para organizar filas em PHP: RabbitMQ, Beanstalkd e Gearman. Você conhecerá suas características, arquitetura, exemplos de uso e aprenderá a escolher a solução adequada para o seu projeto.
1. RabbitMQ
RabbitMQ é um poderoso broker de mensagens que implementa o protocolo AMQP (Advanced Message Queuing Protocol). Ele suporta cenários complexos de roteamento, exchanges, filas com prioridade, confirmações de entrega e muito mais. RabbitMQ é ideal para arquitetura de microsserviços e sistemas onde é necessária uma entrega confiável de mensagens.
Instalação e conexão
Para trabalhar com RabbitMQ em PHP, utiliza-se a biblioteca php-amqplib. Instalação via Composer:
composer require php-amqplib/php-amqplibExemplo: envio de notificação por e-mail
Vamos criar um produtor (remetente) e um consumidor (processador) para o envio de e-mails em segundo plano.
Arquivo producer.php:
<?phprequire_once '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' => 'Bem-vindo!', 'body' => 'Obrigado por se registrar.']);
$msg = new AMQPMessage($data, [ 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');
echo " [x] Mensagem enviada";
$channel->close();$connection->close();Arquivo consumer.php:
<?phprequire_once '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 mensagens. Para sair, pressione CTRL+C";
$callback = function ($msg) { $data = json_decode($msg->body, true); // Simulação de envio de e-mail sleep(2); echo " [x] E-mail enviado para {$data['email']}"; $msg->ack();};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}
$channel->close();$connection->close();2. Beanstalkd
Beanstalkd é um gerenciador de filas leve, rápido e fácil de usar. Ele funciona com um protocolo semelhante ao memcached e é ideal para tarefas que não exigem roteamento complexo. Beanstalkd suporta prioridades, atrasos (delay) e time-to-run (TTR).
Instalação
Para PHP, existe o cliente pda/pheanstalk:
composer require pda/pheanstalkExemplo: processamento de imagens
Suponha que precisamos criar miniaturas para imagens enviadas.
Arquivo producer.php:
<?phprequire_once 'v Também na biblioteca
Envio de SMS em Go (Golang): integração com API de biblioteca
Symfony/Mailer PHP: guia completo com exemplos práticos
Tokens JWT em TypeScript: guia completo para trabalhar com JSON Web Tokens