Server-Sent Events en PHP: tiempo real sin WebSocket y sin dolor de cabeza

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: tiempo real que no muerde

\n\n

¿Alguna vez se ha preguntado por qué su mensajería favorita o el exchange de criptomonedas actualizan los datos al instante, mientras que su sitio en PHP todavía obliga al usuario a presionar F5? Parece que el tiempo real es cosa de unos pocos elegidos, armados con Node.js o costosos servidores WebSocket. Pero, ¿y si le digo que Server-Sent Events (SSE) en PHP es una forma simple, elegante e increíblemente efectiva de agregar actualizaciones en vivo a su proyecto?

\n\n

Bienvenido a PythonLib, donde rompemos estereotipos. Hoy analizaremos Server-Sent Events PHP, una tecnología que permite al servidor «empujar» datos al cliente a través de HTTP común, sin una sola línea de magia JavaScript (bueno, casi sin ella). Sin protocolos complejos, sin problemas con NAT y proxies, solo PHP puro y comprensible, y un flujo de datos que corre como un río de montaña.

\n\n

¿Qué son Server-Sent Events y por qué son una «bala de plata» para PHP?

\n\n

SSE es una especificación de HTML5 que permite al servidor enviar al cliente una cantidad arbitraria de eventos a través de una única conexión HTTP de larga duración. A diferencia de WebSocket, que es bidireccional, SSE funciona solo «del servidor al cliente». ¡Y eso es maravilloso! Para el 90% de las tareas (notificaciones, feeds de noticias, monitoreo, tickers de bolsa) no se necesita retroalimentación. ¿Para qué arrastrar artillería pesada cuando se puede usar armamento ligero de infantería?

\n\n

Las principales ventajas de las notificaciones en tiempo real PHP a través de SSE:

\n
    \n
  • Simplicidad de implementación — del lado del servidor es un script PHP normal que no cierra la conexión.
  • \n
  • Reconexión automática — el navegador se reconecta por sí solo si la conexión se interrumpe.
  • \n
  • Funciona a través de cualquier proxy — HTTP/1.1, HTTP/2, Nginx, Apache, todo funciona de fábrica.
  • \n
  • Bajo consumo de recursos — a diferencia del polling, las solicitudes no se duplican cada 2 segundos.
  • \n
\n\n

Por supuesto, SSE tiene limitaciones: el número máximo de conexiones simultáneas en el navegador (6 por dominio) y no son compatibles con Internet Explorer antiguo. Pero para aplicaciones modernas esto no es un problema. Y si necesita más, use HTTP/2, donde estas limitaciones desaparecen.

\n\n

Cómo funcionan Server-Sent Events en PHP: de la teoría a la práctica

\n\n

Imaginemos que su script PHP es un cantinero. Una solicitud normal es cuando el cliente se acerca, pide una bebida (hace una solicitud GET), el cantinero la sirve (ejecuta el código), entrega el vaso (envía la respuesta) y cierra la barra. Con SSE, el cliente se acerca y pide «por favor, sírvame un nuevo cóctel cada 5 segundos», y el cantinero comienza a servir un chorro interminable sin cerrar el grifo.

\n\n

Técnicamente, se ve así:

\n
    \n
  1. El cliente (navegador) crea un objeto EventSource y envía una solicitud GET al script PHP.
  2. \n
  3. El servidor establece el encabezado Content-Type: text/event-stream y desactiva el almacenamiento en caché.
  4. \n
  5. El servidor entra en un bucle infinito, enviando datos en el formato data: {"message": "hello"}\\n\\n.
  6. \n
  7. Cuando el servidor necesita detenerse (o el cliente cierra la pestaña), la conexión se interrumpe.
  8. \n
\n\n

Primer ejemplo: un simple «hola mundo» con SSE en PHP

\n\n

Creemos un archivo sse.php. Este será nuestro «motor perpetuo»:

\n\n
<?php\n// sse.php - servidor Server-Sent Events más simple\nheader('Content-Type: text/event-stream');\nheader('Cache-Control: no-cache');\nheader('Connection: keep-alive');\nheader('X-Accel-Buffering: no'); // para Nginx\n\n// Asegurémonos de que PHP no interrumpa la ejecución\nset_time_limit(0);\n\n$counter = 0;\n\nwhile (true) {\n    $counter++;\n    $data = ['time' => date('H:i:s'), 'count' => $counter];\n    \n    // Enviamos el evento\n    echo "id: {$counter}\\n";\n    echo "event: update\\n";\n    echo "data: " . json_encode($data) . "\\n\\n";\n    \n    //                

Blogs

Book Recommendations