Server-Sent Events em PHP: tempo real que não morde
\n\nVocê 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\nBem-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\nO que são Server-Sent Events e por que são uma "bala de prata" para PHP?
\n\nSSE é 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\nPrincipais 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
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\nComo funcionam os Server-Sent Events em PHP: da teoria à prática
\n\nVamos 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\nTecnicamente, fica assim:
\n- \n
- O cliente (navegador) cria um objeto
EventSourcee envia uma requisição GET para o script PHP. \n - O servidor define o cabeçalho
Content-Type: text/event-streame desativa o cache. \n - O servidor entra em um loop infinito, enviando dados no formato
data: {"message": "hello"}\\n\\n. \n - Quando o servidor precisa parar (ou o cliente fechou a aba), a conexão é encerrada. \n
Primeiro exemplo: um simples "olá, mundo" com SSE em PHP
\n\nVamos criar o arquivo sse.php. Este será nosso "motor perpétuo":
<?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 //