Server-Sent Events em PHP: quando o servidor fala direto com o navegador
\n\nVocê já parou para pensar como funcionam os feeds de notícias do Twitter, as cotações de moedas na bolsa ou as notificações no mensageiro? Isso mesmo — os dados chegam sozinhos, sem precisar recarregar a página ou fazer infinitas requisições Ajax. A maioria dos desenvolvedores pensa logo em WebSockets, mas existe uma forma muito mais simples e elegante: os Server-Sent Events (SSE).
\n\nNeste artigo, vamos mostrar como implementar Server-Sent Events em PHP do zero. Você vai aprender a enviar dados do servidor em tempo real, sem sobrecarregar a infraestrutura com bibliotecas complexas. Nada de Node.js, nada de filas — apenas PHP puro e HTML5.
\n\nO que são Server-Sent Events e para que servem?
\n\nSSE (Server-Sent Events) é um padrão HTML5 que permite ao servidor enviar dados para o cliente por meio de uma única conexão HTTP. Diferente dos WebSockets, que funcionam nos dois sentidos, o SSE é um canal unidirecional: os dados vão apenas do servidor para o cliente. Mas é justamente aí que está sua grande vantagem: a implementação é tão simples que não exige bibliotecas extras nem servidores especiais.
\n\nOnde os server-sent events php são usados?
\n- \n
- Feeds de notícias e notificações em tempo real \n
- Monitoramento de servidores e logs \n
- Cotações de moedas e ações \n
- Indicadores de progresso para operações longas (upload de arquivos, processamento de vídeo) \n
- Chatbots e sistemas de alerta \n
Ao contrário do polling clássico (onde o cliente faz requisições a cada N segundos), o SSE PHP cria uma conexão permanente que não exige novos handshakes ou cabeçalhos. Isso economiza tráfego e recursos de CPU.
\n\nComo o SSE funciona: protocolo e cabeçalhos
\n\nO SSE é baseado em uma resposta HTTP comum com um tipo de conteúdo especial. O servidor envia dados em formato de texto, usando as palavras-chave event, data, id e retry. O cliente recebe o fluxo e processa os eventos conforme eles chegam.
O protocolo básico é assim:
\nContent-Type: text/event-stream\nCache-Control: no-cache\nConnection: keep-alive\n\ndata: Olá, mundo\n\ndata: {"message": "Isso é JSON"}\n\nCada mensagem começa com data:, seguido do texto. Se precisar enviar várias linhas, basta escrever vários data: em sequência. Uma linha vazia \\n\\n sinaliza o fim da mensagem.
Criando seu primeiro script SSE em PHP
\n\nVamos criar um script simples que envia a hora atual a cada 2 segundos. Este é um exemplo clássico que mostra imediatamente a mágica do PHP em tempo real.
\n\nArquivo sse.php:
<?php\n// Desativa o buffer de saída\nob_implicit_flush(true);\nob_end_flush();\n\n// Define os cabeçalhos 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 // Monta os dados\n $data = [\n 'time' => date('H:i:s'),\n 'timestamp' => time()\n ];\n \n // Envia o evento\n echo "data: " . json_encode($data) . "\\n\\n";\n \n // Verifica se o cliente fechou a conexão\n if (connection_aborted()) {\n break;\n }\n \n // Pausa de 2 segundos\n sleep(2);\n}\n?>\n\nObserve: usamos um loop infinito while(true), mas sempre verificamos connection_aborted(). Se o cliente fechar a aba, o script é encerrado sem sobrecarregar o servidor.
Agora, vamos criar a parte do cliente em JavaScript:
\n<!DOCTYPE html>\n<html>\n<head>\n <title>Demonstração SSE PHP</title>\n</head>\n<body>\n <h2>Hora atual do servidor:</h2