Eventos enviados por servidor en PHP: datos 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

Server-Sent Events en PHP: cuando el servidor llama al navegador

\n\n

¿Alguna vez te has preguntado cómo funcionan los feeds de noticias en Twitter, las tasas de cambio en la bolsa o las notificaciones en un mensajero? Exacto: los datos llegan solos, sin recargar la página ni hacer interminables peticiones Ajax. La mayoría de los desarrolladores piensan inmediatamente en WebSockets, pero existe otra forma mucho más simple y elegante: los Server-Sent Events (SSE).

\n\n

En este artículo veremos cómo implementar Server-Sent Events en PHP desde cero. Aprenderás a enviar datos desde el servidor en tiempo real sin sobrecargar la infraestructura con bibliotecas complejas. Nada de Node.js, nada de colas: solo PHP puro y HTML5.

\n\n

¿Qué son los Server-Sent Events y para qué sirven?

\n\n

SSE (Server-Sent Events) es un estándar de HTML5 que permite al servidor enviar datos al cliente a través de una única conexión HTTP. A diferencia de WebSockets, que funcionan en ambos sentidos, SSE es un canal unidireccional: los datos viajan solo del servidor al cliente. Pero ahí radica su principal ventaja: la implementación es tan sencilla que no necesita bibliotecas adicionales ni servidores especiales.

\n\n

¿Dónde se usan los server-sent events php?

\n
    \n
  • Feeds de noticias y notificaciones en tiempo real
  • \n
  • Monitoreo de servidores y registros
  • \n
  • Tasas de cambio, cotizaciones de acciones
  • \n
  • Indicadores de progreso en operaciones largas (subida de archivos, procesamiento de video)
  • \n
  • Chatbots y sistemas de alertas
  • \n
\n\n

A diferencia del polling clásico (donde el cliente consulta al servidor cada N segundos), SSE PHP crea una conexión permanente que no requiere nuevos apretones de manos ni encabezados. Esto ahorra ancho de banda y recursos de CPU.

\n\n

Cómo funciona SSE: protocolo y encabezados

\n\n

SSE se basa en una respuesta HTTP normal con un tipo de contenido especial. El servidor envía datos en formato de texto usando las palabras clave event, data, id y retry. El cliente recibe el flujo y procesa los eventos a medida que llegan.

\n\n

El protocolo básico se ve así:

\n
Content-Type: text/event-stream\nCache-Control: no-cache\nConnection: keep-alive\n\ndata: Hola, mundo\n\ndata: {"message": "Esto es JSON"}
\n\n

Cada mensaje comienza con data:, seguido del texto. Si necesitas enviar varias líneas, simplemente escribe varios data: seguidos. Una línea vacía \\n\\n indica el final del mensaje.

\n\n

Escribimos nuestro primer script SSE en PHP

\n\n

Vamos a crear un script simple que envíe la hora actual cada 2 segundos. Este es el ejemplo clásico que muestra de inmediato la magia del tiempo real en PHP.

\n\n

Archivo sse.php:

\n
<?php\n// Desactivamos el buffer de salida\nob_implicit_flush(true);\nob_end_flush();\n\n// Configuramos los encabezados SSE\nheader('Content-Type: text/event-stream');\nheader('Cache-Control: no-cache');\nheader('Connection: keep-alive');\nheader('X-Accel-Buffering: no'); // Para Nginx\n\nwhile (true) {\n    // Preparamos los datos\n    $data = [\n        'time' => date('H:i:s'),\n        'timestamp' => time()\n    ];\n    \n    // Enviamos el evento\n    echo "data: " . json_encode($data) . "\\n\\n";\n    \n    // Verificamos si el cliente cerró la conexión\n    if (connection_aborted()) {\n        break;\n    }\n    \n    // Pausa de 2 segundos\n    sleep(2);\n}\n?>
\n\n

Observa que usamos un bucle infinito while(true), pero siempre verificamos connection_aborted(). Si el cliente cierra la pestaña, el script termina sin sobrecargar el servidor.

\n\n

Ahora escribamos la parte del cliente en JavaScript:

\n
<!DOCTYPE html>\n<html>\n<head>\n    <title>Demo SSE PHP</title>\n</head>\n<body>\n    <h2>Hora actual del servidor:</h2\n                

Blogs

Book Recommendations