Publicidade (Anuncie Aqui)

Resolvendo o problema de “headers already sent”

Resolvendo o problema de “headers already sent”

Um erro que muito programador iniciante acaba se deparando aí é o famoso “Warning: Cannot modify header information – headers already sent by…” ou “Warning: Cannot send session cookie – headers already sent by…” e nem sempre é fácil de descobrir o que se fazer para resolver esse erro (que na verdade não é erro, é um warning, um aviso).

Antes de resolver o problema você precisa entender por que esse erro acontece..

Por que “headers already sent”?

Toda página na internet está hospedada em servidor e o seu navegador “pede” ao servidor da página, o resultado (HTML) da página com endereço X… Aí o servidor move os seus pauzinhos, interpreta os arquivos e começa a te responder, enviando um cabeçalho de resposta (o famoso header) esse cabeçalho contém informações sobre a codificação da página, tamanho da página, tempo de duração do cache, hora da ultima atualização e tudo que seja relevante, sobre uma página da Internet, para um navegador.

Depois do envio do header o servidor envia o HTML da página toda e o seu browser começa a montar ela pra você.

Quando você lê “headers already sent” no aviso, significa que o seu servidor já enviou o header e APÓS esse envio, você está tentando criar ou alterar alguma informação que deva ser enviada no header.

Por exemplo, os cookies: são definidos antes do envio do header e enviados para o navegador DENTRO do header… Se você tentar criar ou alterar um cookie depois que o header foi enviado você receberá o aviso de erro.

Outro exemplo que segue a mesma lógica dos Cookies é a Sessão, que são como cookies encriptados que ficam salvos no servidor. Toda sessão possui um cookie identificador (session cookie) que é enviado para o visitante a fim de identificá-lo e manter os valores da sua sessão… Se você tentar criar ou remover algum valor da sessão depois do envio do header vai receber a mensagem de erro “Warning: Cannot send session cookie – headers already sent by…“.

E quando raios eu enviei o header? Eu não fiz nada!

Realmente, se você não usa nenhuma função de manipulação de headers, você não fez nada e está recebendo esse erro… Mas há uma explicação pra isso!

Em se tratando de PHP (e acredito que o mesmo ocorra com todas as outras linguagens WEB que precisam ser lidas por um parseador), o header começa a ser enviado logo que você insira o primeiro caractere no HTML final da página… Seja fora do código PHP com HTML normal, seja dentro do código PHP com um echo ou print().

 <?php
$numero = 3;
$dobro = $numero * 2; // 6
?>

Imagine que, na linha 1, antes do “<?php” houvesse um espaço… Tudo que está fora do “<?php … ?>” é HTML, então um espaço ali seria como o 1° caractere do HTML causando o envio do header… Qualquer função de sessão/cookie/etc. dentro do bloco de PHP iria causar o erro.

<?php
echo 'Olá mundo';
session_start(); // Inicio de sessão depois do envio do header?! Problema!
?>

Esse é outro caso clássico.. O desenvolvedor tentou criar uma sessão (que definirá um cookie de sessão novo) após enviar o header (por causa do echo).

Tá, e como eu resolvo?

Lembra que eu disse que você não fez nada e ainda tá recebendo o erro? Pra resolver o problema é a mesma coisa: nada (além do normal) precisa ser feito… Você só precisa colocar todo código que trabalhe com headers (sessões, cookies, redirecionamentos e etc.) antes de enviar qualquer caractere pro HTML… Nada de tentar definir/criar um cookie ou sessão depois de enviar um “Seja bem vindo!” ou enviar o <head> do seu site.

Cookies e sessões, bem como os redirecionamentos e encriptação de conteúdo devem ser enviados, criados, definidos e modificados ANTES de qualquer HTML… Afinal, todo o HTML pode e deve depender desses fatores.

E antes que você comente dizendo “mas meu site precisa enviar HTML antes de criar um cookie!” eu te respondo “erro de planejamento”. :)

Espero que menos pessoas tenham esse problema a partir de hoje!

Abraços e até a próxima :D

Você também vai gostar de ler:

Postado em PHP, Tutoriais

Com as tags , , , , , , , , , , , , , , , , , , , ,

Escrito por Thiago Belem

Gostou desse artigo?

Não se esqueça de assinar o RSS e divulgue-o para o mundo:

  • http://www.pauloeduardo.com Paulo Eduardo

    Ola Thiago,

    Vale lembrar que alem da possibilidade de que exista um caracter de espaço por exemplo antes do envio dos headers, ainda ha possibilidade do desenvolvedor estar usando um arquivo com algum enconding que insira alguns “caracteres invisiveis” no inicio do arquivo, esses são os mais difíceis de encontrar.

    Na minha opniao o php devia ter umas funções do tipo bock_send_headers() e send_headers() para você poder usar quando alguma coisa saisse do normal.

  • http://www.pauloeduardo.com Paulo Eduardo

    Ola Thiago,

    Vale lembrar que alem da possibilidade de que exista um caracter de espaço por exemplo antes do envio dos headers, ainda ha possibilidade do desenvolvedor estar usando um arquivo com algum enconding que insira alguns “caracteres invisiveis” no inicio do arquivo, esses são os mais difíceis de encontrar.

    Na minha opniao o php devia ter umas funções do tipo bock_send_headers() e send_headers() para você poder usar quando alguma coisa saisse do normal.

  • Bruno

    Muito bacana esse post ^^

    Esse é um erro que muitos iniciantes cometem (inclusive eu õ_O)
    Mas graças a esse post não vou mais errar (eu espero)

    Um abraço o/

  • Bruno

    Muito bacana esse post ^^

    Esse é um erro que muitos iniciantes cometem (inclusive eu õ_O)
    Mas graças a esse post não vou mais errar (eu espero)

    Um abraço o/

  • http://renatoreis.net Renato Reis

    Esse erro aí acontecia muito comigo quando eu tinha alguma função de header(location: “bla bla bla”), eu semprei teimei em por isso no meio de HTML, mas agora quando tem algo que faça isso eu já taco lá em cima a função ou seja lá oque precise disso.

  • http://renatoreis.net Renato Reis

    Esse erro aí acontecia muito comigo quando eu tinha alguma função de header(location: “bla bla bla”), eu semprei teimei em por isso no meio de HTML, mas agora quando tem algo que faça isso eu já taco lá em cima a função ou seja lá oque precise disso.

  • http://www.estaleirodigital.com Diego Sampaio

    Parabéns pelo blog Thiago, mais vale lembrar algo relevante que é o tipo de sistema operacional utilizado por cada servidor de hospedagem, os servidores que usam Linux, temos que converter a codificação para quem esta usando UTF-8 com BOM, para UTF-8 sem BOM, a BOM consiste numa sequencia de caracteres no início dos dados recebidos pelo navegador/agente, a qual define a ordem dos bytes e a forma de codificação, caracteres estes que são lançados de forma oculta ao browser antes dos headers, quando não são ocultos são quase sempre desta forma: 
    Espero ter contribuido, vlw!!!

  • http://www.estaleirodigital.com Diego Sampaio

    Parabéns pelo blog Thiago, mais vale lembrar algo relevante que é o tipo de sistema operacional utilizado por cada servidor de hospedagem, os servidores que usam Linux, temos que converter a codificação para quem esta usando UTF-8 com BOM, para UTF-8 sem BOM, a BOM consiste numa sequencia de caracteres no início dos dados recebidos pelo navegador/agente, a qual define a ordem dos bytes e a forma de codificação, caracteres estes que são lançados de forma oculta ao browser antes dos headers, quando não são ocultos são quase sempre desta forma: 
    Espero ter contribuido, vlw!!!

  • Linces Marques

    E quando a gente usando QueryString? Que é o meu caso aqui.. Dando include em alguma parte do código, ai pagina que eu chamei nesse include tem um session, vai dar erro sempre, a não ser que eu chame o session no inicio da página da que vai chamar o include..

    Não consegui num jeito legal de fazer isso. Alguma idéia?

  • Linces Marques

    E quando a gente usando QueryString? Que é o meu caso aqui.. Dando include em alguma parte do código, ai pagina que eu chamei nesse include tem um session, vai dar erro sempre, a não ser que eu chame o session no inicio da página da que vai chamar o include..

    Não consegui num jeito legal de fazer isso. Alguma idéia?

  • Edilson

    Show esse post ajuda muita gente o que um simples espaço não faz hem!!!
    eu sofri no inicio com esse tipo de erro mais já me livrei disso

    Valeu abraços!!!

  • Edilson

    Show esse post ajuda muita gente o que um simples espaço não faz hem!!!
    eu sofri no inicio com esse tipo de erro mais já me livrei disso

    Valeu abraços!!!

  • http://inhosting.com.br/blog/?p=140 Resolvendo o problema de “headers already sent” « Blog da InHosting

    [...] Em se tratando de PHP (e acredito que o mesmo ocorra com todas as outras linguagens WEB que precisam ser lidas por um parseador), o header começa a ser enviado logo que você insira o primeiro caractere no HTML final da página… Seja fora do código PHP com HTML normal, seja dentro do código PHP com um echo ou print(). view source [...]

  • Cau

    Olá Thiago, bem bacana esse post. Essa é uma dificuldade comum e quem ta iniciando penapra entender o que acontece…
    Mas existem algumas funções PHP que facilitam as coisas. Podemos usar as funções ob_* – de controle de fluxo:

    Isso vai funcionar.
    Além disso há também a função headers_sent() que retorna um valor boleano e informa se os headers já foram enviados.

  • Cau

    Olá Thiago, bem bacana esse post. Essa é uma dificuldade comum e quem ta iniciando penapra entender o que acontece…
    Mas existem algumas funções PHP que facilitam as coisas. Podemos usar as funções ob_* – de controle de fluxo:

    Isso vai funcionar.
    Além disso há também a função headers_sent() que retorna um valor boleano e informa se os headers já foram enviados.

  • Claudio Myst

    Mais um post bem explicado e muito informativo, valeu por mais este Thiago.

  • Claudio Myst

    Mais um post bem explicado e muito informativo, valeu por mais este Thiago.

  • Tyler Vortex

    Excelente explicação!

    Você deve apreciar muito o PHP assim como eu aprecio ^^

  • Tyler Vortex

    Excelente explicação!

    Você deve apreciar muito o PHP assim como eu aprecio ^^

  • Hugo

    Parabéns, melhor explicação que achei sobre esse erro. Me ajudou pra burro!!

  • Hugo

    Parabéns, melhor explicação que achei sobre esse erro. Me ajudou pra burro!!

  • http://twitter.com/diarionovaz Daniel Leal Freitas

    Muito obrigado, fazia tempo que tinha esse dúvida e seu post explicou muito bem o porque..parabéns

  • Edgar Bonfim

    Cara… Me ajudou bastante!
    Obrigado!

  • Ferdi

    Excelente! Salvou uns 30 minutos de procura no código por causa de um espaço ao final do arquivo :)

blog comments powered by Disqus