Trabajo con colas de tareas en PHP: guía práctica completa
\n\nEn las aplicaciones web modernas, a menudo surge la necesidad de realizar operaciones largas o que consumen muchos recursos sin obligar al usuario a esperar. El envío de correos electrónicos masivos, la generación de informes PDF, el procesamiento de imágenes, el análisis de datos: todas estas tareas son ideales para el procesamiento asíncrono a través de colas de tareas. En este artículo, analizaremos en detalle cómo organizar el trabajo con colas de tareas en PHP en la práctica, revisaremos herramientas populares y escribiremos código funcional.
\n\n¿Qué es una cola de tareas y para qué sirve?
\n\nUna cola de tareas (job queue) es un mecanismo que permite colocar tareas en una cola y ejecutarlas de forma asíncrona, fuera del flujo principal de procesamiento de una solicitud HTTP. En lugar de realizar una operación pesada de forma síncrona (por ejemplo, enviar 1000 correos al registrarse), simplemente coloca la tarea en una cola y devuelve inmediatamente una respuesta al usuario. Un worker en segundo plano toma las tareas de la cola y las ejecuta una tras otra.
\n\nPrincipales ventajas de usar colas:
\n- \n
- Mayor rendimiento — el usuario no espera la finalización de operaciones pesadas \n
- Resistencia a fallos — si una tarea no se ejecuta, vuelve a la cola para su reprocesamiento \n
- Escalabilidad — se puede ejecutar cualquier número de workers para procesamiento paralelo \n
- Amortiguación de carga — la cola suaviza los picos de carga en el sistema \n
Herramientas populares para trabajar con colas en PHP
\n\n1. RabbitMQ
\nRabbitMQ es un potente broker de mensajes que admite el protocolo AMQP. Es ideal para escenarios complejos de enrutamiento y requiere la instalación de un servidor independiente.
\n\n// Instalación a través de Composer\ncomposer require php-amqplib/php-amqplib\n\n// Envío de una tarea a la cola\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' => '¡Hola!',\n 'body' => 'Mensaje de prueba'\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 es un almacenamiento rápido en memoria que es excelente para colas simples. php-resque es un puerto en PHP de la popular biblioteca de Ruby Resque.
\n\n// Instalación\ncomposer require chrisboulton/php-resque\n\n// Creación de una tarea\n<?php\nclass SendEmailJob\n{\n public function perform()\n {\n $args = $this->args;\n // Lógica de envío de email\n mail($args['to'], $args['subject'], $args['body']);\n }\n}\n\n// Adición a la cola\nResque::setBackend('localhost:6379');\nResque::enqueue('default', 'SendEmailJob', [\n 'to' => 'user@example.com',\n 'subject' => 'Hola',\n 'body' => 'Prueba'\n]);\n?>\n\n3. Beanstalkd
\nBeanstalkd es un gestor de colas ligero, rápido y confiable. Es fácil de instalar y configurar, lo que lo convierte en una excelente opción para proyectos pequeños.
\n\n// Instalación\ncomposer require pda/pheanstalk\n\n// Envío de una tarea\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' => 'Test']),\n Pheanstalk::DEFAULT_PRIORITY,\n Pheanstalk::DEFAULT_DELAY,\n 60 // TTR (time to run)