Trabalhando com Filas de Tarefas em PHP: Guia Prático Completo
\n\nEm aplicações web modernas, surge frequentemente a necessidade de executar operações longas ou que consomem muitos recursos, sem fazer o usuário esperar. Envio de campanhas de e-mail, geração de relatórios em PDF, processamento de imagens, raspagem de dados — todas essas tarefas são ideais para processamento assíncrono através de filas de tarefas. Neste artigo, vamos detalhar como organizar o trabalho com filas de tarefas em PHP na prática, explorar ferramentas populares e escrever código funcional.
\n\nO que é uma fila de tarefas e por que ela é necessária?
\n\nUma fila de tarefas (job queue) é um mecanismo que permite colocar tarefas em uma fila e executá-las de forma assíncrona, fora do fluxo principal de processamento de uma requisição HTTP. Em vez de executar uma operação pesada de forma síncrona (por exemplo, enviar 1000 e-mails durante um registro), você simplesmente coloca a tarefa na fila e retorna imediatamente uma resposta ao usuário. Um worker em segundo plano (worker) pega as tarefas da fila e as executa uma após a outra.
\n\nPrincipais vantagens do uso de filas:
\n- \n
- Aumento de desempenho — o usuário não espera a conclusão de operações pesadas \n
- Resiliência a falhas — se uma tarefa não for executada, ela retorna à fila para reprocessamento \n
- Escalabilidade — é possível executar qualquer número de workers para processamento paralelo \n
- Amortecimento de carga — a fila suaviza picos de carga no sistema \n
Ferramentas populares para trabalhar com filas em PHP
\n\n1. RabbitMQ
\nRabbitMQ é um poderoso broker de mensagens que suporta o protocolo AMQP. É ideal para cenários complexos de roteamento e requer a instalação de um servidor separado.
\n\n// Instalação via Composer\ncomposer require php-amqplib/php-amqplib\n\n// Envio de tarefa para a fila\n<?php\nrequire_once 'vendor/autoload.php';\n\nuse PhpAmqpLib\\Connection\\AMQPStreamConnection;\nuse PhpAmqpLib\\Message\\AMQPMessage;\n\n$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');\n$channel = $connection->channel();\n$channel->queue_declare('email_queue', false, true, false, false);\n\n$data = json_encode([\n 'to' => 'user@example.com',\n 'subject' => 'Olá!',\n 'body' => 'Mensagem de teste'\n]);\n\n$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);\n$channel->basic_publish($msg, '', 'email_queue');\n$channel->close();\n$connection->close();\n?>\n\n2. Redis + php-resque
\nRedis é um armazenamento in-memory rápido, ideal para filas simples. php-resque é um port em PHP da popular biblioteca Ruby Resque.
\n\n// Instalação\ncomposer require chrisboulton/php-resque\n\n// Criação da tarefa\n<?php\nclass SendEmailJob\n{\n public function perform()\n {\n $args = $this->args;\n // Lógica de envio de e-mail\n mail($args['to'], $args['subject'], $args['body']);\n }\n}\n\n// Adicionando à fila\nResque::setBackend('localhost:6379');\nResque::enqueue('default', 'SendEmailJob', [\n 'to' => 'user@example.com',\n 'subject' => 'Olá',\n 'body' => 'Teste'\n]);\n?>\n\n3. Beanstalkd
\nBeanstalkd é um gerenciador de filas leve, rápido e confiável. É simples de instalar e configurar, tornando-o uma excelente escolha para projetos pequenos.
\n\n// Instalação\ncomposer require pda/pheanstalk\n\n// Envio de tarefa\n<?php\nrequire_once 'vendor/autoload.php';\n\nuse Pheanstalk\\Pheanstalk;\n\n$pheanstalk = Pheanstalk::create('127.0.0.1:11300');\n$pheanstalk->useTube('email_tube')->put(\n json_encode(['to' => 'user@example.com', 'subject' => 'Teste']),\n Pheanstalk::DEFAULT_PRIORITY,\n Pheanstalk::DEFAULT_DELAY,\n 60 // TTR (time to run)