Colas de tareas para PHP: RabbitMQ, Gearman y Redis
En las aplicaciones web modernas en PHP, a menudo surge la necesidad de ejecutar operaciones largas o que consumen muchos recursos sin bloquear el hilo principal del usuario. El envío de correos masivos, la generación de informes, el procesamiento de imágenes, el trabajo con video — todas estas tareas es mejor realizarlas de forma asíncrona, en segundo plano. Para esto existen las colas de tareas (job queues) — mecanismos que permiten posponer la ejecución de una tarea y procesarla más tarde mediante workers.
En este artículo, analizaremos tres herramientas populares para organizar colas de tareas en PHP: RabbitMQ, Gearman y Redis. Aprenderá en qué casos utilizarlas y verá ejemplos de código.
¿Para qué sirven las colas de tareas?
Las principales ventajas de usar colas:
- Asincronía — el usuario no espera a que finalice una operación pesada.
- Escalabilidad — puede ejecutar múltiples workers para el procesamiento en paralelo.
- Tolerancia a fallos — si un worker falla, la tarea permanece en la cola y se procesará más tarde.
- Separación de responsabilidades — el código que envía la tarea y el código que la procesa están débilmente acoplados.
1. RabbitMQ — potente broker de mensajes
RabbitMQ es un broker de mensajes completo que admite el protocolo AMQP. Proporciona entrega garantizada, enrutamiento, confirmaciones y mucho más. Es adecuado para sistemas complejos con alta carga.
Para trabajar con RabbitMQ en PHP se utiliza la extensión php-amqplib.
Instalación
composer require php-amqplib/php-amqplibEjemplo: envío de una tarea
<?phprequire_once __DIR__ . '/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' => '¡Hola!']);$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');echo "Tarea enviada a la cola";
$channel->close();$connection->close();Ejemplo: worker (procesador)
<?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);
$callback = function ($msg) { $data = json_decode($msg->body, true); echo "Enviando correo a {$data['email']} con asunto '{$data['subject']}'"; // Aquí el envío real de email $msg->ack(); // Confirmación de procesamiento};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}2. Gearman — sistema distribuido de tareas
Gearman se especializa en el procesamiento distribuido de tareas. Permite invocar funciones en servidores remotos o en segundo plano. Es ideal para arquitecturas de microservicios.
Para PHP existe la extensión gearman (PECL).
Instalación
sudo apt install gearman-job-serverpecl install gearmanEjemplo: cliente (envío de tarea)
<?php$client = new GearmanClient();$client->addServer('127.0.0.1', 4730);
$result = $client->doBackground('send_email', json_encode([ 'email' => 'user@example.com', 'subject' => '¡Hola!']));
echo "Tarea enviada También en la biblioteca
Monitoreo de aplicaciones C++: biblioteca metrics para recopilación de métricas
Trabajo con S3 y almacenamiento en la nube en C++: biblioteca AWS SDK para C++
Biblioteca GraphQL JavaScript (Node.js) — Guía completa