Algo que pode ser utilizado, mas nem sempre se sabe como é a compresão da saída, ou seja você comprime a página antes de enviá-la ao cliente. Com a compressão você ganha em banda disponível, já que a maioria dos servidores limita a banda de transferência de dados, e se você comprime uma página de 1500Kb para 800Kb, depois de algumas visitas já terá economizado alguns megabytes. Mas um problema óbvio da compressão é que ela consome tempo e processamento, portanto deve ser utilizada com cautela: por exemplo não ajustar a compressão para o máximo.
Para configurar a compressão há dois modos: na configuração do servidor ou através de código.
A configuração do servidor só poderá ser feita se você tem acesso ao php.ini, se tiver abra-o em algum editor e procure pela linha zlib.output_compression, se estiver comentada, então descomente, se estiver em Off, mude para On. Em seguida você deve configurar o nível de compressão, para isso procure por zlib.output_compression_level, que deve estar logo abaixo do anterior, o grau de compressão deve ser um inteiro entre 0 (sem compressão) até no máximo 9 (compressão máxima).
No final deve ficar mais ou menos assim:
; Transparent output compression using the zlib library
; Valid values for this option are 'off', 'on', or a specific buffer size
; to be used for compression (default is 4KB)
; Note: Resulting chunk size may vary due to nature of compression. PHP
; outputs chunks that are few hundreds bytes each as a result of
; compression. If you prefer a larger chunk size for better
; performance, enable output_buffering in addition.
; Note: You need to use zlib.output_handler instead of the standard
; output_handler, or otherwise the output will be corrupted.
zlib.output_compression = On
zlib.output_compression_level = 5
Mesmo se você não tiver acesso ao php.ini, ainda há a possibilidade de compressão da saída. Por código é possível capturar o conteúdo do buffer de saída antes de ele ser enviado ao cliente, comprimi-lo, e só então enviar ao cliente, mas isso é a teoria, vamos a prática:
O primeiro a fazer é executar a função ob_start() antes de qualquer coisa no seu arquivo, e em seguida a função ob_implicit_flush(), passando 0 (zero) como parâmetro, que fará com que o buffer não seja enviado a cada operação de saída. Nosso código fica assim:
<?php
// Impede o envio imediato do buffer de saída
ob_start();
ob_implicit_flush(0);
?>
Para comprimir o conteúdo do buffer, vamos ao fim do arquivo, após tudo já ter sido executado. Para evitar erros vamos ter certeza que temos disponíveis a função de compressão. Para isso usaremos a função function_exists(), passando como parâmetro a string ‘gzcompress’, se tudo estiver certo, continuaremos nosso código, senão deixaremos tudo continuar e o buffer ser enviado.
<?php
if(function_exists("gzcompress") === true) {
// Aqui faremos a compressão
}
?>
Vamos agora verificar o mime-type (tipo) aceito pelo navegador do cliente, para isso existe a global pré-definida $_SERVER["HTTP_ACCEPT_ENCODING"], que retorna uma string listando todas as condificações aceitas. Vamos procurar nessa lista por ‘x-gzip’ e ‘gzip’, se encontrarmos comprimiremos, em caso contrário deve-se alterar o método de compressão (não falarei de outro métodos) ou deixar a saida como está (sem compressão).
<?php
if(function_exists("gzcompress") === true) {
// A codificação aceita será detectada (se houver) e guardada uma variável
if(strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "x-gzip") !== false) {
$encoding = "x-gzip";
} elseif(strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip") !== false) {
$encoding = "gzip";
}
// Aqui continuaremos a compressão
}
?>
Se for identificada uma possível condificação proseguiremos com a compressão, senão, podemos enviar o conteúdo do buffer para a saída com ob_end_flush() e terminar o arquivo com exit(). Em caso de identificação positiva para uma codificação, iremos obter o conteúdo do buffer com ob_get_contents() e então esvaziá-lo com a função ob_end_clean(), já que em seguida refaremos o seu conteúdo.
Vamos em seguida, “avisar” ao navegador que a saída será codificada através da função header(), passando como Content-Encoding o que encontramos anteriormente através da global $_SERVER. Um detalhe importante, é que devemos enviar o cabeçalho do arquivo gzip para o navegador, para isso basta imprimir a sequência “\x1f\x8b\x08\x00\x00\x00\x00\x00″. Feito isso, poderemos imprimir o conteúdo comprimido com gzcompress() e finalizar a operação. Deve ficar aproximadamente assim no final:
<?php
if(function_exists("gzcompress") === true) {
// A codificação aceita será detectada (se houver) e guardada uma variável
if(strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "x-gzip") !== false) {
$encoding = "x-gzip";
} elseif(strpos($_SERVER["HTTP_ACCEPT_ENCODING"], "gzip") !== false) {
$encoding = "gzip";
}
if(!empty($encoding)) {
// Obtendo o conteúdo do buffer
$content = ob_get_contents();
// Limpando e desativando o buffer
ob_end_clean();// Informando que o conteúdo será codificado
header("Content-Encoding: " . $encoding);
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
// Comprimindo o conteúdo da página
// A compressão aqui está em nível 5, que pode ser considerada mediana
echo gzcompress($content, 5);
// Informando que a execução está acabada
exit();
} else {
// Enviando o conteúdo não comprimido para a saída
ob_end_flush();
// Informando que a execução está acabada
exit();
}
}
?>
Ufa! Quanto código, pois é, mas isso garante um fluxo pequeno de dados. Mas lembre-se: isto consome tempo e processamento, não exagere! Até mais!
Últimos Comentários