No universo PHP é muito comum desenvolver aplicações, realizar requisições, obter respostas de várias formas, porém, é dificil encontrar desenvolvedores que entendam esse processo e consequentemente, é mais difícil ainda encontrar aplicações padronizadas, com headers bem definidos e livres de divergências e problemas. Quando se usa um framework, tudo fica mais fácil, porém, quando se trata de uma aplicação feita na unha, os erros são diversos.
Os erros mais comuns são:
- Página de erro 404 que retorna no seu header Status Code 200;
- Má formatação do header;
- Erro de header já enviado;
- Dentre outros…
Esse tutorial tem o intuito de auxiliar os desenvolvedores a usarem, com mais responsabilidade e de forma correta, o recurso de manipulação de header que a linguagem PHP fornece, mas antes, é necessário que você, amiguinho, entenda sobre o protocolo HTTP.
O que é o protocolo HTTP? ↩
HTTP é um protocolo que se define especificamente ao processo de um cliente realizar uma requisição à um servidor e, então, o servidor enviar respostas novamente ao cliente. O entendimento do seu processo funcional é bem simples, porém, não vamos nos focar nele, já que nosso propósito aqui é outro, mas existem excelentes artigos para o entendimento do mesmo. Abaixo deixarei um link onde é explicado em detalhes todo o processo disponível na Wikipédia.
Vale lembrar também que recentemente foi lançado o HTTP 2.0 e o SPDY, que trás em sua implementação, compressão Automática, maior segurança pois existe a necessidade de uso de conexões seguras, envio de cabeçalhos somente daquilo que mudar, dentre outros, para saber mais sobre a novidade, recomendo a leitura dessa matéria na Wikipédia a respeito das novidades.
Coisas simples que é possível fazer no header com PHP ↩
Para isso, usaremos a função header()
do próprio PHP.
Responder com um tipo de dado ↩
O header te dá a possibilidade de responder ao cliente com um tipo de dado especifico. Por exemplo, uma página que você deseja que seja exibida e renderizada como um PDF, é possível manipular a resposta do servidor para que o cliente entenda que trata-se de um arquivo PDF, vejamos:
header('Content-Type: application/pdf');
E se fosse um XML?
header('Content-Type: application/xml');
E se eu quisesse passar um charset para um PDF?
header('Content-Type: application/pdf; charset:utf-8;');
Podemos responder com qualquer tipo de dado que possua um header válido e, caso o navegador te permita renderizar o tipo de dado em questão, que assim seja.
Fazendo download de um arquivo a partir do header ↩
O PHP te permite realizar download de arquivos também através do header, para isso é simples. Basta chamar, no início do arquivo o seguinte:
$file = $_GET['file'].'.pdf'; //Aqui é opcional, estou supondo que será usando um parâmetro da URL para decidir o nome do arquivo PDF.
header("Content-Disposition: attachment; filename=" . urlencode($file));
header("Content-Type: application/pdf");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: " . filesize($file));
No exemplo acima, estamos pegando um parâmetro da URL e estamos encodando ele e disponibilizando para donwload.
Manipulando o Código de Status (Status Code) ↩
Como disse no começo, um dos erros mais comuns é a criação de uma página linda de erro 404, porém, quando o cliente obtem a resposta, ele a recebe com status 200. Quem é mais afixionado com SEO com certeza infartará com isso. Então, podemos manipular (e devemos) a resposta para cada tipo de resposta. No PHP, é extremamente simples, basta declarar no início do arquivo o seguinte header:
header("HTTP/1.0 404 Not Found");
Outros tipos de resposta podem ser fornecidas para o Status Code. Para tal, veja a lista de Status Code.
E se o header já foi enviado? ↩
Warning: Cannot modify header information – headers already sent by …
Existem vários motivos para esse erro ser apresentado, vou descrever aqui os mais comuns, o que de certa forma já nos fornece um ponto de partida.
-
O primeiro deles é, sujeira no início do arquivo PHP, usando um editor de texto como o hexeditor é possível identificar esse erro:
.
-
Caso o arquivo esteja formatado com o formato
UTF-8 BOM
, também é possível obter o erro, neste caso, mude a formatação do arquivo para UTF-8 apenas. -
Caso tenha espaços em branco no início do arquivo, também é passivo de ocorrer o erro. Neste caso, certifique-se de que não existe nenhum espaço em branco no início do arquivo.
ESPAÇOS AQUI >>>
-
Um pouco mais complexo, porém, também acertivo, é limpar completamente o buffer, porém, essa solução pode acarretar em outros erros. Caso a página em questão já tenha algo previamente carregado, essas informações serão perdidas, é uma excelente solução para páginas que não possuam nenhuma relação com outras páginas e que todo o seu conteúdo será carregado a partir daquela página em questão, se esses critérios vierem a ser atendidos, basta usar no início do arquivo:
ob_start();
//Todo o seu código…
ob_end_flush();
-
Declarações de
header()
no meio do código. Amiguinho… Como o próprio nome já diz,header
oucabeçalho
devem ser passadas no início do arquivo, caso você passe um header no meio ou final do seu código, não espere que tudo fique bem.
Creio que com esse pequeno tutorial seja possível expandir o conhecimento quando o assunto são os headers de uma requisição ou resposta HTTP feitas através de uma página com PHP, mas não é o fim, espero ter ajudado por ora e até a próxima!!!