Colas de tareas en PHP: guía práctica completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con colas de tareas en PHP: guía práctica completa

\n\n

En 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\n

Una 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\n

Principales 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
\n\n

Herramientas populares para trabajar con colas en PHP

\n\n

1. RabbitMQ

\n

RabbitMQ 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\n

2. Redis + php-resque

\n

Redis 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\n

3. Beanstalkd

\n

Beanstalkd 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)                

Blogs

Book Recommendations