{"id":19170,"date":"2026-11-06T19:06:33","date_gmt":"2026-11-06T19:06:33","guid":{"rendered":"https:\/\/soloweb.com.br\/blog\/?p=19170"},"modified":"2026-11-06T19:06:35","modified_gmt":"2026-11-06T19:06:35","slug":"server-sent-events-streaming-tempo-real-event-source","status":"publish","type":"post","link":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/","title":{"rendered":"Server-Sent Events: streaming em tempo real com EventSource"},"content":{"rendered":"<div style=\"font-family:Arial,Helvetica,sans-serif;color:#222;line-height:1.7;font-size:16px;\">\n<p>Imagine acompanhar a importa\u00e7\u00e3o de um cat\u00e1logo com milhares de produtos sem precisar apertar F5 a cada dez segundos. O navegador mostra o percentual avan\u00e7ando, a etapa atual e o total processado, tudo em tempo real, enquanto o servidor continua trabalhando. \u00c9 exatamente para cen\u00e1rios assim que existem os <strong>Server-Sent Events<\/strong> (SSE): um padr\u00e3o da web para enviar atualiza\u00e7\u00f5es cont\u00ednuas do servidor para o cliente por uma \u00fanica conex\u00e3o HTTP.<\/p>\n<p>Neste guia t\u00e9cnico vamos al\u00e9m da defini\u00e7\u00e3o: voc\u00ea vai entender o formato do stream, escrever um consumidor com <strong>EventSource<\/strong>, montar o endpoint no servidor, lidar com reconex\u00e3o, heartbeat, proxies e escolher com seguran\u00e7a entre SSE, WebSocket e polling.<\/p>\n<div style=\"background:#eaf5ea;border:2px solid #4CAF50;padding:20px;border-radius:8px;text-align:center;margin:24px 0;\">\n<p style=\"margin:0 0 12px;\"><strong>\ud83d\ude80 Precisa de uma solu\u00e7\u00e3o personalizada para o seu projeto?<\/strong><\/p>\n<p style=\"margin:0 0 14px;\">Fale com a equipe da SOLOWEB e tire sua ideia do papel com infraestrutura e desenvolvimento sob medida.<\/p>\n<p style=\"margin:0;\"><a href=\"https:\/\/soloweb.com.br\/\" style=\"display:inline-block;background:#4CAF50;color:#fff;padding:14px 30px;border-radius:6px;font-weight:bold;text-decoration:none;\">FALE COM A SOLOWEB<\/a><\/p>\n<\/div>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">O que s\u00e3o Server-Sent Events<\/h2>\n<p>SSE \u00e9 um mecanismo de streaming unidirecional sobre HTTP. O cliente abre um pedido <code>GET<\/code> comum e o servidor responde com o tipo <code>text\/event-stream<\/code>, mantendo a resposta aberta. A partir da\u00ed, cada novidade \u00e9 escrita como um bloco de texto terminado por uma linha em branco. O navegador interpreta esses blocos e dispara eventos JavaScript automaticamente.<\/p>\n<p>A grande vantagem est\u00e1 na simplicidade: n\u00e3o existe handshake especial, upgrade de protocolo nem biblioteca obrigat\u00f3ria no front-end. Um <code>EventSource<\/code> resolve a conex\u00e3o, o parser do formato e a reconex\u00e3o. Do lado do servidor, basta escrever texto no formato correto e garantir que nada fique preso em buffers intermedi\u00e1rios.<\/p>\n<h3 style=\"color:#1b5e3a;font-size:19px;margin-bottom:6px;\">Como o fluxo funciona na pr\u00e1tica<\/h3>\n<ul style=\"padding-left:22px;\">\n<li>\u2705 O cliente cria um <code>EventSource<\/code> apontando para um endpoint.<\/li>\n<li>\u2705 O servidor responde com <code>200 OK<\/code> e <code>Content-Type: text\/event-stream<\/code>.<\/li>\n<li>\u2705 Cada evento \u00e9 enviado como linhas de campo (<code>event<\/code>, <code>data<\/code>, <code>id<\/code>, <code>retry<\/code>) e finalizado com <code>\\n\\n<\/code>.<\/li>\n<li>\u2705 O navegador dispara listeners nomeados ou o evento gen\u00e9rico <code>message<\/code>.<\/li>\n<li>\u2705 Se a conex\u00e3o cair, o pr\u00f3prio navegador tenta reconectar e envia o header <code>Last-Event-ID<\/code>.<\/li>\n<\/ul>\n<p>O canal \u00e9 de m\u00e3o \u00fanica: o servidor fala, o cliente escuta. Se o navegador precisar enviar comandos, isso \u00e9 feito por requisi\u00e7\u00f5es HTTP separadas. Essa limita\u00e7\u00e3o \u00e9, ao mesmo tempo, a maior virtude do SSE, porque elimina toda a complexidade de gerenciar um protocolo bidirecional quando o objetivo \u00e9 apenas receber atualiza\u00e7\u00f5es.<\/p>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">O formato do stream: texto simples e leg\u00edvel<\/h2>\n<p>O corpo da resposta \u00e9 texto UTF-8. Cada mensagem \u00e9 composta por uma ou mais linhas no padr\u00e3o <code>campo: valor<\/code>, separadas por uma linha vazia. Os campos principais s\u00e3o:<\/p>\n<table style=\"width:100%;border-collapse:collapse;margin:18px 0;font-size:15px;\">\n<thead>\n<tr>\n<th style=\"background:#0b3d2e;color:#fff;text-align:left;padding:10px;border:1px solid #d5ded8;\">Campo<\/th>\n<th style=\"background:#0b3d2e;color:#fff;text-align:left;padding:10px;border:1px solid #d5ded8;\">Fun\u00e7\u00e3o<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:10px;border:1px solid #d5ded8;\"><code>data<\/code><\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Conte\u00fado do evento. Linhas <code>data<\/code> consecutivas s\u00e3o unidas com quebra de linha.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #d5ded8;\"><code>event<\/code><\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Nome do evento. Sem ele, o navegador dispara <code>message<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #d5ded8;\"><code>id<\/code><\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Identificador usado na retomada ap\u00f3s queda de conex\u00e3o.<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #d5ded8;\"><code>retry<\/code><\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Intervalo sugerido, em milissegundos, para a reconex\u00e3o autom\u00e1tica.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Uma linha iniciada por dois-pontos \u00e9 um coment\u00e1rio e n\u00e3o gera evento. Parece detalhe, mas \u00e9 a base de uma t\u00e9cnica essencial: enviar <code>: ping<\/code> periodicamente para manter a conex\u00e3o viva e evitar timeouts de proxies.<\/p>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">Na pr\u00e1tica: acompanhando uma importa\u00e7\u00e3o no navegador<\/h2>\n<p>Vamos usar um caso comum em pain\u00e9is administrativos: acompanhar o andamento de uma importa\u00e7\u00e3o de cat\u00e1logo. O servidor envia tr\u00eas tipos de evento \u2014 <code>progresso<\/code>, <code>concluido<\/code> e <code>falha<\/code> \u2014 e o cliente atualiza a interface sem polling.<\/p>\n<pre style=\"background:#f6f8fa;color:#1f2328;border:1px solid #d0d7de;padding:18px;border-radius:8px;overflow-x:auto;font-size:14px;line-height:1.5;\"><code style=\"background:transparent;color:#1f2328;font-family:Consolas,Monaco,'Courier New',monospace;font-size:14px;\">const barra = document.querySelector('#barra');\nconst fonte = new EventSource('\/api\/importacoes\/42\/eventos');\n\nfonte.addEventListener('progresso', (evento) =&gt; {\n  const dados = JSON.parse(evento.data);\n  barra.style.width = dados.percentual + '%';\n  barra.textContent = dados.etapa;\n});\n\nfonte.addEventListener('concluido', (evento) =&gt; {\n  console.log('Importa\u00e7\u00e3o finalizada:', JSON.parse(evento.data));\n  fonte.close();\n});\n\nfonte.onerror = () =&gt; {\n  console.warn('Conex\u00e3o interrompida. O navegador tentar\u00e1 reconectar.');\n};<\/code><\/pre>\n<p>Repare que <code>progresso<\/code> e <code>concluido<\/code> s\u00e3o eventos nomeados, escutados com <code>addEventListener<\/code>. Se o servidor omitir o campo <code>event<\/code>, o callback <code>onmessage<\/code> \u00e9 acionado. Os dois estilos podem conviver no mesmo stream, o que ajuda a separar mensagens de sistema de mensagens de neg\u00f3cio.<\/p>\n<p>O <code>evento.data<\/code> \u00e9 sempre uma string. Se voc\u00ea trafega JSON, precisa fazer o parse no cliente. Tamb\u00e9m vale guardar <code>evento.lastEventId<\/code> quando a ordem e a retomada forem importantes.<\/p>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">Do outro lado: escrevendo eventos no servidor<\/h2>\n<p>O endpoint precisa de tr\u00eas coisas: o tipo de conte\u00fado correto, a garantia de que a resposta ser\u00e1 enviada em peda\u00e7os e a limpeza dos recursos quando o cliente desconectar. Um exemplo completo em PHP, com headers, retomada por <code>Last-Event-ID<\/code> e heartbeat:<\/p>\n<pre style=\"background:#f6f8fa;color:#1f2328;border:1px solid #d0d7de;padding:18px;border-radius:8px;overflow-x:auto;font-size:14px;line-height:1.5;\"><code style=\"background:transparent;color:#1f2328;font-family:Consolas,Monaco,'Courier New',monospace;font-size:14px;\">&lt;?php\nheader('Content-Type: text\/event-stream; charset=utf-8');\nheader('Cache-Control: no-cache, no-transform');\nheader('X-Accel-Buffering: no');\nheader('Connection: keep-alive');\n\nwhile (ob_get_level() &gt; 0) {\n    ob_end_flush();\n}\n\nfunction enviarEvento(string $tipo, array $dados, int $id): void\n{\n    echo \"id: {$id}\\n\";\n    echo \"event: {$tipo}\\n\";\n    echo 'data: ' . json_encode($dados, JSON_UNESCAPED_UNICODE) . \"\\n\\n\";\n    flush();\n}\n\n$sequencia = (int) ($_SERVER['HTTP_LAST_EVENT_ID'] ?? 0);\n$ultimoSinal = time();\n\nwhile (!connection_aborted()) {\n    $sequencia++;\n    enviarEvento('progresso', [\n        'percentual' =&gt; min(100, $sequencia * 5),\n        'etapa' =&gt; 'Processando lote ' . $sequencia,\n    ], $sequencia);\n\n    if ($sequencia &gt;= 20) {\n        enviarEvento('concluido', ['total' =&gt; 1200], $sequencia);\n        break;\n    }\n\n    if (time() - $ultimoSinal &gt;= 15) {\n        echo \": keep-alive\\n\\n\";\n        flush();\n        $ultimoSinal = time();\n    }\n\n    sleep(1);\n}<\/code><\/pre>\n<h3 style=\"color:#1b5e3a;font-size:19px;margin-bottom:6px;\">Cabe\u00e7alhos que evitam dor de cabe\u00e7a<\/h3>\n<p>O <code>Content-Type<\/code> \u00e9 obrigat\u00f3rio. O <code>Cache-Control: no-cache<\/code> impede cache de respostas din\u00e2micas, e o <code>no-transform<\/code> desencoraja intermedi\u00e1rios de reescrever o corpo. J\u00e1 o <code>X-Accel-Buffering: no<\/code> \u00e9 um pedido expl\u00edcito para o Nginx n\u00e3o segurar os pacotes. Em HTTP\/1.1, <code>Connection: keep-alive<\/code> mant\u00e9m o canal aberto.<\/p>\n<p>Em PHP, tamb\u00e9m \u00e9 essencial encerrar os buffers de sa\u00edda e chamar <code>flush()<\/code> depois de cada evento. Sem isso, o servidor pode acumular mensagens e entreg\u00e1-las todas de uma vez, o que anula a experi\u00eancia de tempo real. O <code>connection_aborted()<\/code> dentro do la\u00e7o encerra o processamento quando o navegador fecha a aba, liberando o processo PHP.<\/p>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">Reconex\u00e3o, Last-Event-ID e heartbeat<\/h2>\n<p>A reconex\u00e3o \u00e9 um dos maiores atrativos do SSE porque \u00e9 nativa. Quando a conex\u00e3o cai, o navegador espera o intervalo definido em <code>retry<\/code> (ou alguns segundos por padr\u00e3o) e tenta novamente. Se o \u00faltimo evento tinha um <code>id<\/code>, a nova requisi\u00e7\u00e3o inclui o header <code>Last-Event-ID<\/code>.<\/p>\n<p>Isso permite retomada elegante: o servidor consulta o hist\u00f3rico a partir daquele identificador e continua de onde parou. Para que funcione, os IDs precisam ser est\u00e1veis e orden\u00e1veis \u2014 n\u00fameros sequenciais, timestamps com precis\u00e3o ou identificadores de eventos persistidos. N\u00e3o adianta enviar IDs aleat\u00f3rios e esperar m\u00e1gica.<\/p>\n<p>Outro ponto cr\u00edtico \u00e9 o heartbeat. Muitos proxies, balanceadores e CDNs encerram conex\u00f5es ociosas. Envie um coment\u00e1rio a cada 15 ou 20 segundos, como <code>: keep-alive<\/code>, para mostrar que o canal est\u00e1 vivo. O cliente ignora o coment\u00e1rio, mas a infraestrutura entende que h\u00e1 tr\u00e1fego.<\/p>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">SSE, WebSocket ou polling?<\/h2>\n<p>N\u00e3o existe vencedor absoluto. Existe encaixe. A tabela abaixo resume as diferen\u00e7as que mais importam na hora de decidir:<\/p>\n<table style=\"width:100%;border-collapse:collapse;margin:18px 0;font-size:15px;\">\n<thead>\n<tr>\n<th style=\"background:#0b3d2e;color:#fff;text-align:left;padding:10px;border:1px solid #d5ded8;\">Abordagem<\/th>\n<th style=\"background:#0b3d2e;color:#fff;text-align:left;padding:10px;border:1px solid #d5ded8;\">Dire\u00e7\u00e3o<\/th>\n<th style=\"background:#0b3d2e;color:#fff;text-align:left;padding:10px;border:1px solid #d5ded8;\">Melhor cen\u00e1rio<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:10px;border:1px solid #d5ded8;\"><strong>SSE<\/strong><\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Servidor \u2192 cliente<\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Notifica\u00e7\u00f5es, progresso, dashboards, logs e streaming de texto<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #d5ded8;\"><strong>WebSocket<\/strong><\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Bidirecional<\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Chat, jogos, edi\u00e7\u00e3o colaborativa e dados bin\u00e1rios<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #d5ded8;\"><strong>Polling<\/strong><\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Cliente \u2192 servidor<\/td>\n<td style=\"padding:10px;border:1px solid #d5ded8;\">Compatibilidade legada ou atualiza\u00e7\u00f5es pouco frequentes<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>O SSE costuma vencer quando o fluxo \u00e9 predominantemente do servidor para o navegador. Ele reaproveita autentica\u00e7\u00e3o, TLS, logs e m\u00e9tricas do HTTP, al\u00e9m de sobreviver melhor a ambientes corporativos restritivos. O WebSocket faz sentido quando as duas pontas conversam o tempo todo ou quando h\u00e1 frames bin\u00e1rios. J\u00e1 o polling continua \u00fatil como plano B, mas tende a desperdi\u00e7ar requisi\u00e7\u00f5es e a introduzir atraso.<\/p>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">Boas pr\u00e1ticas para produ\u00e7\u00e3o<\/h2>\n<ul style=\"padding-left:22px;\">\n<li>\u2705 <strong>Heartbeat obrigat\u00f3rio:<\/strong> coment\u00e1rios peri\u00f3dicos mant\u00eam vivos proxies e balanceadores.<\/li>\n<li>\u2705 <strong>Sem buffering:<\/strong> desative compress\u00e3o e buffering no caminho inteiro, inclusive CDN.<\/li>\n<li>\u2705 <strong>Timeouts coerentes:<\/strong> o timeout de leitura do proxy precisa ser maior que o intervalo do heartbeat.<\/li>\n<li>\u2705 <strong>Limpeza no disconnect:<\/strong> cancele timers, assinaturas e consultas quando o cliente sair.<\/li>\n<li>\u2705 <strong>IDs confi\u00e1veis:<\/strong> use identificadores persistentes para permitir retomada correta.<\/li>\n<li>\u2705 <strong>Backpressure:<\/strong> se o cliente for lento, descarte ou agrupe eventos em vez de acumular mem\u00f3ria.<\/li>\n<li>\u2705 <strong>Observabilidade:<\/strong> monitore conex\u00f5es abertas, dura\u00e7\u00e3o m\u00e9dia e taxa de reconex\u00e3o.<\/li>\n<\/ul>\n<h3 style=\"color:#1b5e3a;font-size:19px;margin-bottom:6px;\">Autentica\u00e7\u00e3o e seguran\u00e7a<\/h3>\n<p>O <code>EventSource<\/code> envia cookies same-origin automaticamente. Em origens diferentes, \u00e9 preciso habilitar <code>withCredentials<\/code> e configurar CORS com cuidado, sem usar <code>*<\/code> quando h\u00e1 credenciais. Evite colocar tokens de longa dura\u00e7\u00e3o na URL, pois eles aparecem em logs e hist\u00f3ricos; prefira cookies <code>HttpOnly<\/code> ou um ticket de curta dura\u00e7\u00e3o. Valide a origem, limite conex\u00f5es por usu\u00e1rio e nunca transmita dados sens\u00edveis que o cliente n\u00e3o deveria ver.<\/p>\n<h3 style=\"color:#1b5e3a;font-size:19px;margin-bottom:6px;\">Proxy, HTTP\/2 e escala<\/h3>\n<p>Em HTTP\/1.1, navegadores limitam conex\u00f5es simult\u00e2neas por dom\u00ednio, o que pode incomodar quando muitas abas mant\u00eam streams abertos. HTTP\/2 resolve isso com multiplexa\u00e7\u00e3o e \u00e9 a configura\u00e7\u00e3o recomendada. No Nginx, garanta <code>proxy_buffering off<\/code> e timeouts adequados para a rota de streaming. Em ambientes com v\u00e1rias inst\u00e2ncias, use um back-end de publica\u00e7\u00e3o (Redis, NATS ou fila equivalente) para que qualquer n\u00f3 consiga entregar eventos ao cliente, independentemente de onde a conex\u00e3o caiu.<\/p>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">Quando SSE \u00e9 a escolha certa<\/h2>\n<p>Alguns cen\u00e1rios em que o SSE brilha:<\/p>\n<ul style=\"padding-left:22px;\">\n<li>\ud83c\udfaf <strong>Progresso de tarefas longas:<\/strong> importa\u00e7\u00f5es, exporta\u00e7\u00f5es, gera\u00e7\u00e3o de relat\u00f3rios e processamento em lote.<\/li>\n<li>\ud83c\udfaf <strong>Notifica\u00e7\u00f5es e alertas:<\/strong> avisos internos, status de pedidos e eventos de conta.<\/li>\n<li>\ud83c\udfaf <strong>Dashboards operacionais:<\/strong> m\u00e9tricas e indicadores que mudam com frequ\u00eancia.<\/li>\n<li>\ud83c\udfaf <strong>Streaming de texto:<\/strong> respostas de modelos de linguagem e logs em tempo real.<\/li>\n<li>\ud83c\udfaf <strong>Feeds e monitoramento:<\/strong> acompanhamento de filas, deploys e sistemas.<\/li>\n<\/ul>\n<p>Evite SSE quando o cliente precisa enviar mensagens com alta frequ\u00eancia, quando o tr\u00e1fego \u00e9 bin\u00e1rio ou quando o volume de conex\u00f5es abertas inviabiliza a arquitetura sem um plano claro de escala. Nesses casos, WebSocket ou uma combina\u00e7\u00e3o de HTTP com webhooks costuma ser mais adequada.<\/p>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">Perguntas frequentes<\/h2>\n<h3 style=\"color:#1b5e3a;font-size:19px;margin-bottom:6px;\">SSE funciona em todos os navegadores?<\/h3>\n<p>Os navegadores modernos oferecem suporte consolidado ao <code>EventSource<\/code>. Ainda assim, vale testar webviews embarcados e clientes antigos. Aplica\u00e7\u00f5es nativas podem consumir o stream com qualquer biblioteca HTTP, j\u00e1 que o formato \u00e9 apenas texto.<\/p>\n<h3 style=\"color:#1b5e3a;font-size:19px;margin-bottom:6px;\">SSE \u00e9 a mesma coisa que streaming HTTP?<\/h3>\n<p>\u00c9 um formato espec\u00edfico de streaming sobre HTTP. Existem outras abordagens, como NDJSON ou respostas chunked arbitr\u00e1rias, mas elas n\u00e3o acionam automaticamente o parser e a reconex\u00e3o do <code>EventSource<\/code>.<\/p>\n<h3 style=\"color:#1b5e3a;font-size:19px;margin-bottom:6px;\">Posso enviar dados bin\u00e1rios?<\/h3>\n<p>N\u00e3o diretamente. O stream \u00e9 texto UTF-8. Se precisar trafegar bin\u00e1rio, codifique em base64 ou avalie WebSocket.<\/p>\n<h3 style=\"color:#1b5e3a;font-size:19px;margin-bottom:6px;\">Como testar um endpoint SSE pelo terminal?<\/h3>\n<p>Use uma ferramenta que n\u00e3o bufferize a sa\u00edda, como <code>curl -N -H \"Accept: text\/event-stream\" https:\/\/seu-dominio.com\/eventos<\/code>. Voc\u00ea ver\u00e1 os eventos chegando em tempo real.<\/p>\n<h2 style=\"color:#0b3d2e;font-size:24px;margin-top:32px;\">Conclus\u00e3o<\/h2>\n<p>Server-Sent Events entregam muito com pouco: um endpoint HTTP, um formato de texto simples e a API <code>EventSource<\/code> no navegador. Para atualiza\u00e7\u00f5es que fluem do servidor para o cliente, \u00e9 uma alternativa enxuta, resiliente e f\u00e1cil de operar. O pr\u00f3ximo passo \u00e9 mapear seu caso de uso, definir a estrat\u00e9gia de heartbeat e retomada e revisar o caminho entre aplica\u00e7\u00e3o, proxy e CDN.<\/p>\n<p>Se a sua equipe precisa de uma solu\u00e7\u00e3o personalizada, seja para construir esse tipo de integra\u00e7\u00e3o, seja para preparar a infraestrutura que vai sustent\u00e1-la, fale com a SOLOWEB em <a href=\"https:\/\/soloweb.com.br\/\" style=\"color:#1b7f3a;\">www.soloweb.com.br<\/a>.<\/p>\n<p>Esperamos ter ajudado com mais esta dica, e siga nos, nas redes sociais para mais tutoriais, e se precisar de nossa ajuda estamos a disposi\u00e7\u00e3o: www.soloweb.com.br.<\/p>\n<p><strong>E lembrando que a SOLOWEB al\u00e9m de oferecer Hospedagem de Sites, Servidores Dedicados, Servidores VPS com o menor custo do Brasil, tamb\u00e9m desenvolve solu\u00e7\u00f5es de software e realiza gerenciamento e monitoramento de servidores para sua empresa, fa\u00e7a uma cota\u00e7\u00e3o sem custo, acesse: <a href=\"https:\/\/soloweb.com.br\/\" style=\"color:#1b7f3a;\">www.soloweb.com.br<\/a><\/strong><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Entenda Server-Sent Events na pr\u00e1tica: formato text\/event-stream, EventSource, reconex\u00e3o, heartbeat, seguran\u00e7a e quando usar SSE em vez de WebSocket.<\/p>\n","protected":false},"author":4,"featured_media":19172,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","video_url":"","footnotes":""},"categories":[106,302,303,240,54],"tags":[269,330,802,224,70,800,100,801],"class_list":["post-19170","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimento","category-destaque-principal","category-destaque-secundario","category-javascript","category-tutoriais","tag-api","tag-desenvolvimento","tag-http","tag-javascript","tag-php","tag-server-sent-events","tag-soloweb","tag-sse"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Server-Sent Events: streaming em tempo real com EventSource - SOLOWEB Tecnologia<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Server-Sent Events: streaming em tempo real com EventSource - SOLOWEB Tecnologia\" \/>\n<meta property=\"og:description\" content=\"Entenda Server-Sent Events na pr\u00e1tica: formato text\/event-stream, EventSource, reconex\u00e3o, heartbeat, seguran\u00e7a e quando usar SSE em vez de WebSocket.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/\" \/>\n<meta property=\"og:site_name\" content=\"SOLOWEB Tecnologia\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-06T19:06:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-11-06T19:06:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2026\/11\/soloweb-1.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"940\" \/>\n\t<meta property=\"og:image:height\" content=\"787\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Carlos Rolim\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Carlos Rolim\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/\"},\"author\":{\"name\":\"Carlos Rolim\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/01acb4ee8336c3620fd633ea5430cf2f\"},\"headline\":\"Server-Sent Events: streaming em tempo real com EventSource\",\"datePublished\":\"2026-11-06T19:06:33+00:00\",\"dateModified\":\"2026-11-06T19:06:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/\"},\"wordCount\":1737,\"publisher\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/soloweb-1.jpeg\",\"keywords\":[\"api\",\"desenvolvimento\",\"http\",\"javascript\",\"PHP\",\"server-sent events\",\"soloweb\",\"sse\"],\"articleSection\":[\"Desenvolvimento\",\"Destaque Principal\",\"Destaque Secund\u00e1rio\",\"JavaScript\",\"Tutoriais\"],\"inLanguage\":\"pt-BR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/\",\"url\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/\",\"name\":\"Server-Sent Events: streaming em tempo real com EventSource - SOLOWEB Tecnologia\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/soloweb-1.jpeg\",\"datePublished\":\"2026-11-06T19:06:33+00:00\",\"dateModified\":\"2026-11-06T19:06:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/#primaryimage\",\"url\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/soloweb-1.jpeg\",\"contentUrl\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/soloweb-1.jpeg\",\"width\":940,\"height\":787},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/2026\\\/11\\\/06\\\/server-sent-events-streaming-tempo-real-event-source\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Server-Sent Events: streaming em tempo real com EventSource\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/\",\"name\":\"SOLOWEB Tecnologia\",\"description\":\"SOLOWEB Tecnologia\",\"publisher\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/#organization\",\"name\":\"SOLOWEB Tecnologia\",\"url\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/cropped-solo.png\",\"contentUrl\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2022\\\/04\\\/cropped-solo.png\",\"width\":341,\"height\":94,\"caption\":\"SOLOWEB Tecnologia\"},\"image\":{\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/#\\\/schema\\\/person\\\/01acb4ee8336c3620fd633ea5430cf2f\",\"name\":\"Carlos Rolim\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/avatar_user_4_1674993909-96x96.png\",\"url\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/avatar_user_4_1674993909-96x96.png\",\"contentUrl\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/01\\\/avatar_user_4_1674993909-96x96.png\",\"caption\":\"Carlos Rolim\"},\"sameAs\":[\"http:\\\/\\\/carlosrolim.com\"],\"url\":\"https:\\\/\\\/soloweb.com.br\\\/blog\\\/author\\\/carlos\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Server-Sent Events: streaming em tempo real com EventSource - SOLOWEB Tecnologia","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/","og_locale":"pt_BR","og_type":"article","og_title":"Server-Sent Events: streaming em tempo real com EventSource - SOLOWEB Tecnologia","og_description":"Entenda Server-Sent Events na pr\u00e1tica: formato text\/event-stream, EventSource, reconex\u00e3o, heartbeat, seguran\u00e7a e quando usar SSE em vez de WebSocket.","og_url":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/","og_site_name":"SOLOWEB Tecnologia","article_published_time":"2026-11-06T19:06:33+00:00","article_modified_time":"2026-11-06T19:06:35+00:00","og_image":[{"width":940,"height":787,"url":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2026\/11\/soloweb-1.jpeg","type":"image\/jpeg"}],"author":"Carlos Rolim","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Carlos Rolim","Est. tempo de leitura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/#article","isPartOf":{"@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/"},"author":{"name":"Carlos Rolim","@id":"https:\/\/soloweb.com.br\/blog\/#\/schema\/person\/01acb4ee8336c3620fd633ea5430cf2f"},"headline":"Server-Sent Events: streaming em tempo real com EventSource","datePublished":"2026-11-06T19:06:33+00:00","dateModified":"2026-11-06T19:06:35+00:00","mainEntityOfPage":{"@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/"},"wordCount":1737,"publisher":{"@id":"https:\/\/soloweb.com.br\/blog\/#organization"},"image":{"@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/#primaryimage"},"thumbnailUrl":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2026\/11\/soloweb-1.jpeg","keywords":["api","desenvolvimento","http","javascript","PHP","server-sent events","soloweb","sse"],"articleSection":["Desenvolvimento","Destaque Principal","Destaque Secund\u00e1rio","JavaScript","Tutoriais"],"inLanguage":"pt-BR"},{"@type":"WebPage","@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/","url":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/","name":"Server-Sent Events: streaming em tempo real com EventSource - SOLOWEB Tecnologia","isPartOf":{"@id":"https:\/\/soloweb.com.br\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/#primaryimage"},"image":{"@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/#primaryimage"},"thumbnailUrl":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2026\/11\/soloweb-1.jpeg","datePublished":"2026-11-06T19:06:33+00:00","dateModified":"2026-11-06T19:06:35+00:00","breadcrumb":{"@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/#primaryimage","url":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2026\/11\/soloweb-1.jpeg","contentUrl":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2026\/11\/soloweb-1.jpeg","width":940,"height":787},{"@type":"BreadcrumbList","@id":"https:\/\/soloweb.com.br\/blog\/2026\/11\/06\/server-sent-events-streaming-tempo-real-event-source\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/soloweb.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"Server-Sent Events: streaming em tempo real com EventSource"}]},{"@type":"WebSite","@id":"https:\/\/soloweb.com.br\/blog\/#website","url":"https:\/\/soloweb.com.br\/blog\/","name":"SOLOWEB Tecnologia","description":"SOLOWEB Tecnologia","publisher":{"@id":"https:\/\/soloweb.com.br\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/soloweb.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/soloweb.com.br\/blog\/#organization","name":"SOLOWEB Tecnologia","url":"https:\/\/soloweb.com.br\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/soloweb.com.br\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2022\/04\/cropped-solo.png","contentUrl":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2022\/04\/cropped-solo.png","width":341,"height":94,"caption":"SOLOWEB Tecnologia"},"image":{"@id":"https:\/\/soloweb.com.br\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/soloweb.com.br\/blog\/#\/schema\/person\/01acb4ee8336c3620fd633ea5430cf2f","name":"Carlos Rolim","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2023\/01\/avatar_user_4_1674993909-96x96.png","url":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2023\/01\/avatar_user_4_1674993909-96x96.png","contentUrl":"https:\/\/soloweb.com.br\/blog\/wp-content\/uploads\/2023\/01\/avatar_user_4_1674993909-96x96.png","caption":"Carlos Rolim"},"sameAs":["http:\/\/carlosrolim.com"],"url":"https:\/\/soloweb.com.br\/blog\/author\/carlos\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/19170","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/comments?post=19170"}],"version-history":[{"count":1,"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/19170\/revisions"}],"predecessor-version":[{"id":19171,"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/19170\/revisions\/19171"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/media\/19172"}],"wp:attachment":[{"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/media?parent=19170"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/categories?post=19170"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soloweb.com.br\/blog\/wp-json\/wp\/v2\/tags?post=19170"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}