¿QUÉ ES SPLPRIORITYQUEUE EN PHP?
SplPriorityQueue es una clase de la Standard PHP Library, SPL, que implementa una cola de prioridad, Priority Queue.- Es una estructura de dato heap donde cada elemento tiene una prioridad.
- Al extraer elementos, siempre se obtiene primero el de mayor prioridad.
- Internamente está implementada como un Max-Heap.
- En una cola normal (FIFO): primero entra → primero sale.
- En SplPriorityQueue: sale primero el elemento con mayor prioridad, independientemente del orden de inserción.
Métodos más utilizados
- insert($value, $priority): Inserta un elemento con su prioridad.
- extract(): Extrae y elimina el elemento con mayor prioridad.
- top(): Muestra el elemento de mayor prioridad sin eliminarlo.
- isEmpty(): Devuelve true si la cola está vacía.
- count(): Devuelve la cantidad de elementos en la cola.
- setExtractFlags(): Permite configurar qué se devuelve al hacer extract() (valor, prioridad o ambos).
Ejemplo (MAx-Heap)
$queue = new SplPriorityQueue();
// insert(valor, prioridad)
$queue->insert("Tarea A", 10); // prioridad media
$queue->insert("Tarea B", 5); // prioridad baja
$queue->insert("Tarea C", 20); // prioridad alta
$queue->insert("Tarea D", 15);
echo $queue->extract(); // → Tarea C (prioridad 20)
echo $queue->extract(); // → Tarea D (prioridad 15)
echo $queue->extract(); // → Tarea A (prioridad 10)
echo $queue->extract(); // → Tarea B (prioridad 5)
//Salida
Procesando: Alerta de seguridad
Procesando: Procesar pago fallido
Procesando: Enviar email de bienvenida
Crear un Min-Heap (prioridad mínima)
Como SplPriorityQueue es un Max-Heap, si se quiere que salga primero el elemento con menor valor (por ejemplo, el número más pequeño), se pueden usar prioridades negativas:$queue = new SplPriorityQueue();
$queue->insert("Elemento A", -10); // menor número = mayor prioridad negativa
$queue->insert("Elemento B", -5);
$queue->insert("Elemento C", -25);
echo $queue->extract(); // → Elemento C (-25)
// ==================== MIN HEAP (menor valor primero) ====================
$minHeap = new SplMinHeap();
$minHeap->insert(10);
$minHeap->insert(30);
$minHeap->insert(5);
$minHeap->insert(25);
echo "\n\nMinHeap - Extrayendo en orden ascendente:\n";
while (!$minHeap->isEmpty()) {
echo $minHeap->extract() . " ";
}
// Salida: 5 10 25 30Ventajas
- Muy eficiente para manejar prioridades.
- Implementada en C (rápida).
- No requiere instalar extensiones adicionales.
- Ideal cuando se necesita procesar elementos en orden de importancia.
Desventajas
- No permite actualizar fácilmente la prioridad de un elemento que ya está en la cola ya que no tiene método "decreaseKey" nativo.
- En algunos casos se insertan elementos duplicados para simular actualizaciones de prioridad.
Usos Comunes de SplPriorityQueue en PHP
| Uso Principal | Descripción / Para qué sirve |
|---|---|
| Sistemas de Tareas y Jobs | Procesar tareas en orden de prioridad (urgentes primero) |
| Colas de Notificaciones | Enviar notificaciones críticas antes que las informativas |
| Sistemas de Atención al Cliente | Gestionar tickets de soporte (críticos, altos, medios, bajos) |
| Procesamiento de Pedidos en E-commerce | Procesar primero los pedidos de clientes VIP o pagos ya confirmados |
| Sistemas de Impresión o Envío | Imprimir o enviar documentos según prioridad (facturas urgentes primero) |
| Algoritmos de Planificación | Planificar eventos, reuniones, envíos o mantenimientos |
| Background Workers / Queues | Mejorar Laravel Horizon, Symfony Messenger o colas personalizadas |
| Juegos y Simulaciones | Procesar acciones de jugadores según prioridad (ataques, movimientos, etc.) |
| Sistemas de Logging Inteligente | Guardar logs de error primero, luego warnings y finalmente info |
| Optimización de Recursos | Asignar servidores, CPU o conexiones a las solicitudes más importantes primero |