Makrosites

Suas ideias em realidade digital!

Headers already sent em PHP: como corrigir (guia prático)

Headers already sent em PHP: como corrigir (guia prático)

O que significa “Headers already sent” em PHP?

O erro Cannot modify header information - headers already sent acontece quando o PHP tenta enviar um header (como header("Location: ..."), cookies ou sessão), mas o servidor já começou a enviar conteúdo para o navegador. Em outras palavras: saída (output) aconteceu antes do header.

Principais causas (as 6 mais comuns)

Exemplo clássico do erro

✅ Correto

Como descobrir quem “enviou saída” primeiro

A mensagem geralmente mostra algo como: output started at /caminho/arquivo.php:12. Esse é o ponto onde começou a saída. Abra esse arquivo e verifique:

  • se existe HTML “solto” antes do PHP
  • se tem espaços/linhas antes do
  • se existe ?> no final com espaços depois

1) Remova o fechamento ?> (boa prática)

Se o arquivo é só PHP, prefira terminar sem ?>. Isso evita espaços acidentais no final.

2) Atenção ao BOM (UTF-8 BOM)

O BOM é um “marcador invisível” que alguns editores colocam no começo do arquivo. Isso conta como saída e quebra o header().

  • No VS Code: salve como UTF-8 (sem BOM).
  • Se estiver em Windows/Notepad++: procure por “UTF-8 BOM” e converta.

3) Includes: o vilão silencioso

Se você faz include de um arquivo que tem HTML/echo antes, ele pode causar o erro. Exemplo:

Solução: faça redirecionamento antes, ou reorganize a ordem:

4) “Output buffering” (quando você precisa salvar tempo)

Se seu projeto é grande e você não consegue corrigir tudo agora, dá pra usar buffer:

Observação: isso é um “band-aid”. O ideal é corrigir a origem (BOM/echo/espaços).

5) Sessão e cookies também geram “headers”

Funções como session_start() e setcookie() precisam rodar antes de qualquer saída. Sempre coloque no topo:

Checklist rápido (copiar e colar)

  • [ ] Não existe nada antes do
  • [ ] Arquivo salvo em UTF-8 sem BOM
  • [ ] Removi ?> no final (arquivos PHP puros)
  • [ ] Não tem echo/print/var_dump antes de header()
  • [ ] session_start() está no topo
  • [ ] Includes não estão imprimindo saída antes do redirecionamento