Colas de tareas para PHP: RabbitMQ, Gearman y PhpAmqpLib
En las aplicaciones web modernas, la velocidad de respuesta al usuario es críticamente importante. Las operaciones largas (envío de correo electrónico, generación de PDF, procesamiento de imágenes, análisis de datos) no deben bloquear el flujo principal de ejecución. La solución a este problema son las colas de tareas (job queues). Permiten delegar tareas en segundo plano a trabajadores que operan de forma asíncrona.
En el ecosistema PHP existen varias soluciones maduras para organizar colas. Consideremos tres herramientas clave: PhpAmqpLib (cliente para RabbitMQ), Gearman y el RabbitMQ nativo a través de su protocolo AMQP.
¿Por qué se necesitan colas de tareas en PHP?
Escenario típico: un usuario se registra en un sitio web. El sistema debe:
- Guardar los datos en la base de datos
- Enviar un correo de bienvenida
- Crear un contrato en PDF
- Iniciar una verificación de spam
Sin cola, el usuario espera a que se completen todas las operaciones. Con cola:
- El proceso principal guarda los datos y envía la tarea a la cola
- El usuario recibe instantáneamente la respuesta "Éxito"
- Los trabajadores en segundo plano procesan las tareas una por una
Esto mejora la experiencia de usuario (UX) y la estabilidad del sistema.
1. RabbitMQ y PhpAmqpLib
RabbitMQ es un potente broker de mensajes que soporta el protocolo AMQP 0-9-1. PhpAmqpLib es una implementación puramente en PHP de un cliente para trabajar con RabbitMQ sin extensiones externas.
Instalación
composer require php-amqplib/php-amqplibEjemplo: Envío de tarea (Producer)
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
// Declaramos la cola (se crea si no existe)$channel->queue_declare('email_queue', false, true, false, false);
$data = json_encode([ 'to' => 'user@example.com', 'subject' => 'Bienvenida', 'body' => '¡Bienvenido!']);
$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);$channel->basic_publish($msg, '', 'email_queue');
echo " [x] Enviado: $data";
$channel->close();$connection->close();Ejemplo: Trabajador (Consumer)
<?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);
echo " [*] Esperando tareas. Para salir presione CTRL+C";
$callback = function ($msg) { $data = json_decode($msg->body, true); // Simulación de envío de correo echo " [x] Enviando correo a {$data['to']}: {$data['subject']}"; sleep(2); // Simulación de trabajo echo " [x] Listo"; $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();}Ventajas: confiabilidad, soporte para enrutamiento complejo (topics, headers), persistencia de mensajes, agrupación en clúster.
Desventajas: requiere instalación y configuración del servidor RabbitMQ (Erlang, administración a través de interfaz web).
2. Gearman
Gearman es un sistema de tareas distribuidas. Consta de tres componentes: cliente (envía tareas), trabajador (ejecuta), servidor (despachador). Funciona a través de un protocolo binario.
Instalación
Primero instale el servidor Gearman y la extensión PHP:
sudo apt-get install gearman-job-s