Long polling vs WebSocket en PHP: qué elegir para un proyecto en tiempo real

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

Introducción: ¿por qué su sitio web «se ralentiza» en tiempo real?

\n\n

Imagine que entra a un sitio de bolsa y el tipo de cambio del dólar solo se actualiza después de recargar la página. O envía un mensaje en un chat y su interlocutor lo ve 10 segundos después. ¿Le suena familiar? Este es el dolor de cualquier desarrollador que intenta hacer que una aplicación sea «viva».

\n\n

En el mundo de PHP, donde cada solicitud vive una vida corta, implementar funciones en tiempo real es una tarea no trivial. Los dos enfoques principales que vienen al rescate son Long polling y WebSocket. ¿Cuál elegir para su proyecto en PHP? Vamos a analizarlo sin rodeos, con ejemplos de código reales.

\n\n

¿Qué es Long polling en PHP? Una solicitud larga con un secreto

\n\n

Long polling es un truco elegante que permite simular una conexión en tiempo real utilizando solicitudes HTTP normales. El cliente envía una solicitud al servidor, pero el servidor no responde de inmediato. Mantiene la conexión abierta hasta que ocurre un nuevo evento (por ejemplo, un nuevo mensaje en el chat). Tan pronto como ocurre el evento, el servidor envía una respuesta, el cliente la procesa e inmediatamente crea una nueva solicitud «larga».

\n\n

Cómo funciona en PHP: un ejemplo simple

\n\n

Supongamos que tenemos un chat simple. El cliente envía una solicitud AJAX a un script PHP que «se cuelga» en un bucle hasta que aparece un nuevo mensaje en la base de datos.

\n\n
<?php\n// long_polling.php\nheader('Content-Type: application/json');\nheader('Cache-Control: no-cache');\n\n$lastMessageId = $_GET['last_id'] ?? 0;\n$timeout = 30; // esperamos hasta 30 segundos\n$startTime = time();\n\nwhile (time() - $startTime < $timeout) {\n    // Simulamos una verificación de BD (en realidad, una consulta a MySQL/PostgreSQL)\n    $newMessages = getNewMessagesFromDB($lastMessageId);\n    \n    if (!empty($newMessages)) {\n        echo json_encode([\n            'status' => 'success',\n            'messages' => $newMessages\n        ]);\n        exit;\n    }\n    \n    // Dormimos 1 segundo para no saturar la CPU\n    sleep(1);\n}\n\n// Si no llega nada en 30 segundos\necho json_encode(['status' => 'timeout', 'messages' => []]);\nexit;\n?>
\n\n

En el cliente (JavaScript) se ve así:

\n\n
function startLongPolling(lastId) {\n    fetch('/long_polling.php?last_id=' + lastId)\n        .then(response => response.json())\n        .then(data => {\n            if (data.status === 'success') {\n                data.messages.forEach(msg => addMessageToChat(msg));\n                startLongPolling(data.messages[data.messages.length - 1].id);\n            } else {\n                startLongPolling(lastId); // timeout — simplemente reiniciamos\n            }\n        })\n        .catch(() => setTimeout(() => startLongPolling(lastId), 1000));\n}\n
\n\n

Ventajas de Long polling en PHP

\n
    \n
  • Simplicidad de implementación — no se necesitan servidores ni bibliotecas adicionales. Todo funciona con Apache/Nginx + PHP-FPM normales.
  • \n
  • Compatibilidad — funciona en cualquier lugar donde haya HTTP. Sin problemas con proxies, firewalls corporativos.
  • \n
  • Baja barrera de entrada — si conoce PHP y AJAX, ya puede hacer Long polling.
  • \n
\n\n

Desventajas de Long polling

\n
    \n
  • Carga en el servidor — cada solicitud «larga» mantiene ocupado un proceso de PHP-FPM. Con 1000 usuarios, necesitará 1000 procesos.
  • \n
  • Latencia — la latencia mínima es de 1 segundo (debido a sleep). Si reduce sleep, la CPU comenzará a sobrecalentarse.
  • \n
  • Dificultad de escalado — Long polling no se lleva bien con los balanceadores de carga (es necesario vincular al usuario a un servidor específico).
  • \n
\n\n

WebSocket en PHP: tiempo real real sin concesiones

\n\n

WebSocket es un canal de comunicación bidireccional completo sobre TCP. Después del handshake a través de HTTP,

Blogs

Book Recommendations