leitura de
Encontrou um problema no conteúdo? Por favor, deixe seu comentário!

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().

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.

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

Thiago Belem / Blog

Thiago Belem


Publicado

Thiago Belem / Blog

Thiago Belem / Blog

Artigos e tutoriais sobre desenvolvimento WEB

Continue lendo