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\nEn 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\nSSE (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
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\nCómo funciona SSE: protocolo y encabezados
\n\nSSE 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.
El protocolo básico se ve así:
\nContent-Type: text/event-stream\nCache-Control: no-cache\nConnection: keep-alive\n\ndata: Hola, mundo\n\ndata: {"message": "Esto es JSON"}\n\nCada 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.
Escribimos nuestro primer script SSE en PHP
\n\nVamos 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\nArchivo sse.php:
<?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\nObserva 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.
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