Server-Sent Events em PHP: tempo real sem WebSocket e sem dor de cabeça

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Server-Sent Events em PHP: tempo real que não morde

\n\n

Você já se perguntou por que seu mensageiro favorito ou exchange de criptomoedas atualiza os dados instantaneamente, enquanto seu site em PHP ainda obriga o usuário a apertar F5? Parece que o tempo real é privilégio de poucos, armados com Node.js ou caros servidores WebSocket. Mas e se eu lhe disser que Server-Sent Events (SSE) em PHP é uma forma simples, elegante e incrivelmente eficiente de adicionar atualizações ao vivo ao seu projeto?

\n\n

Bem-vindo ao PythonLib, onde quebramos estereótipos. Hoje vamos analisar Server-Sent Events PHP — uma tecnologia que permite ao servidor "empurrar" dados para o cliente via HTTP comum, sem uma única linha de mágica JavaScript (bem, quase sem ela). Sem protocolos complexos, sem problemas com NAT e proxies — apenas PHP puro e compreensível, e um fluxo de dados que corre como um rio de montanha.

\n\n

O que são Server-Sent Events e por que são uma "bala de prata" para PHP?

\n\n

SSE é uma especificação HTML5 que permite ao servidor enviar ao cliente um número arbitrário de eventos através de uma única conexão HTTP de longa duração. Ao contrário do WebSocket, que é bidirecional, o SSE funciona apenas "do servidor para o cliente". E isso é ótimo! Para 90% das tarefas (notificações, feeds de notícias, monitoramento, tickers de bolsa), o feedback não é necessário. Para que carregar artilharia pesada quando se pode usar armas leves de infantaria?

\n\n

Principais vantagens das notificações em tempo real PHP via SSE:

\n
    \n
  • Simplicidade de implementação — no lado do servidor, é um script PHP comum que não fecha a conexão.
  • \n
  • Reconexão automática — o navegador se reconecta sozinho se a conexão for perdida.
  • \n
  • Funciona através de qualquer proxy — HTTP/1.1, HTTP/2, Nginx, Apache — tudo funciona de fábrica.
  • \n
  • Baixo consumo de recursos — ao contrário do polling, as requisições não são duplicadas a cada 2 segundos.
  • \n
\n\n

Claro, o SSE tem limitações: número máximo de conexões simultâneas no navegador (6 por domínio), e não é suportado em Internet Explorer antigo. Mas para aplicações modernas, isso não é problema. E se precisar de mais — use HTTP/2, onde essas limitações são removidas.

\n\n

Como funcionam os Server-Sent Events em PHP: da teoria à prática

\n\n

Vamos imaginar que seu script PHP é um barman. Uma requisição normal é quando o cliente chega, pede uma bebida (faz uma requisição GET), o barman serve (executa o código), entrega o copo (envia a resposta) e fecha o bar. No SSE, o cliente chega, pede "por favor, me sirva um novo coquetel a cada 5 segundos", e o barman começa a servir um fluxo infinito, sem fechar a torneira.

\n\n

Tecnicamente, fica assim:

\n
    \n
  1. O cliente (navegador) cria um objeto EventSource e envia uma requisição GET para o script PHP.
  2. \n
  3. O servidor define o cabeçalho Content-Type: text/event-stream e desativa o cache.
  4. \n
  5. O servidor entra em um loop infinito, enviando dados no formato data: {"message": "hello"}\\n\\n.
  6. \n
  7. Quando o servidor precisa parar (ou o cliente fechou a aba), a conexão é encerrada.
  8. \n
\n\n

Primeiro exemplo: um simples "olá, mundo" com SSE em PHP

\n\n

Vamos criar o arquivo sse.php. Este será nosso "motor perpétuo":

\n\n
<?php\n// sse.php - servidor Server-Sent Events mais simples\nheader('Content-Type: text/event-stream');\nheader('Cache-Control: no-cache');\nheader('Connection: keep-alive');\nheader('X-Accel-Buffering: no'); // para Nginx\n\n// Garantir que o PHP não interrompa a execução\nset_time_limit(0);\n\n$counter = 0;\n\nwhile (true) {\n    $counter++;\n    $data = ['time' => date('H:i:s'), 'count' => $counter];\n    \n    // Enviar evento\n    echo "id: {$counter}\\n";\n    echo "event: update\\n";\n    echo "data: " . json_encode($data) . "\\n\\n";\n    \n    //                

Blogs

Book Recommendations