“Cannot modify header information, headers already sent”: como achar a linha que o causou

A mensagem completa é “Warning: Cannot modify header information - headers already sent by (output started at /caminho/ficheiro.php:12)”. Quer dizer: o PHP já começou a enviar texto ao navegador, e depois disso já não pode mudar os cabeçalhos (redireccionar, iniciar uma sessão, gravar um cookie, entregar um ficheiro). O que interessa está dentro dos parêntesis: o ficheiro e a linha onde o texto começou a sair. É aí que está o culpado.

Ler a mensagem

Parte da mensagem O que diz
headers already sent by (output started at ficheiro:linha) Onde começou a sair texto. Comece por aqui.
... in outro-ficheiro.php on line N Onde o código tentou mudar o cabeçalho (um header(), session_start() ou setcookie()). É a vítima, não o culpado.

As causas, da mais comum para a menos comum

1 Espaços ou linhas em branco fora do PHP. Uma linha em branco antes de <?php, ou depois de um ?> final, é texto enviado. Acontece muito em ficheiros de configuração editados à mão, como o wp-config.php ou o functions.php de um tema. O remédio é apagar o espaço e, em ficheiros que são só PHP, deixar de usar o ?> final.
2 O “BOM”. Alguns editores (o Bloco de Notas, por exemplo) guardam o ficheiro com três bytes invisíveis no início. Para os apanhar, num Terminal Linux: grep -rl $'\xEF\xBB\xBF' --include=*.php .. Reguarde o ficheiro como “UTF-8 sem BOM”.
3 Um echo, print ou HTML antes do header(). Em código seu, passe a mudança de cabeçalho para o início, antes de qualquer saída.
4 Um aviso ou erro impresso. Se o PHP escreve um aviso no ecrã, esse texto já é saída e os cabeçalhos seguintes falham. Resolva o aviso original: veja avisos do PHP no site: o que são e como os silenciar.
5 Um plugin ou um tema. Em WordPress, a mensagem nomeia o ficheiro do plugin ou do tema. Desactive-o e veja se desaparece. Veja desactivar plugins, incluindo quando não consegue entrar.

O “truque” que adia o problema

Um ob_start() no início do código guarda a saída em memória e só a envia no fim, e assim os cabeçalhos ainda se podem mudar. Resolve o sintoma, não a causa, e esconde o espaço em branco que continua lá. Aqui o PHP vem com o output_buffering desligado, por isso qualquer byte antes do cabeçalho dá o erro. Use o ob_start() como último recurso, em código seu, e não como correcção de um ficheiro de terceiros.

Edite sempre uma cópia. Um erro num wp-config.php ou num functions.php deixa o site em branco. Antes de mexer, guarde uma cópia do ficheiro. Se o site ficar em branco, veja uma página em branco em PHP: como ver o erro.
Redirecciones e sessões são as vítimas habituais. “O início de sessão não redirecciona” ou “as sessões não gravam” têm muitas vezes esta origem. Veja sessões do PHP: onde vivem e porque as pessoas saem da conta.

Tem a mensagem com o ficheiro e a linha e não percebe o que está lá? Envie-nos a mensagem completa e o endereço da página.

Abrir um pedido de suporte

VEJA TAMBÉM

Avisos do PHP no site: o que são e como os silenciar

Sessões do PHP: onde vivem e porque as pessoas saem da conta

Onde está o registo de erros do PHP

Uma página em branco em PHP: como ver o erro

PRODUTO RECOMENDADO

Alojamento de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde 5.940,00 Kz/mês (plano de 3 anos, com cupão)

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?