Server-Sent Events em PHP: como enviar dados do servidor em tempo real

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: quando o servidor fala direto com o navegador

\n\n

Você 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\n

Neste 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\n

O que são Server-Sent Events e para que servem?

\n\n

SSE (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\n

Onde 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
\n\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\n

Como o SSE funciona: protocolo e cabeçalhos

\n\n

O 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.

\n\n

O protocolo básico é assim:

\n
Content-Type: text/event-stream\nCache-Control: no-cache\nConnection: keep-alive\n\ndata: Olá, mundo\n\ndata: {"message": "Isso é JSON"}
\n\n

Cada 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.

\n\n

Criando seu primeiro script SSE em PHP

\n\n

Vamos 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\n

Arquivo sse.php:

\n
<?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\n

Observe: usamos um loop infinito while(true), mas sempre verificamos connection_aborted(). Se o cliente fechar a aba, o script é encerrado sem sobrecarregar o servidor.

\n\n

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                

Blogs

Book Recommendations