• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

Melhor forma de comprimir output gerado por PHP

14 mensagens neste tópico

No último script que estou a fazer decidi usar compressão no output, até porque estou a usar intensivamente JavaScript e aquele código todo comprimido é que fica bonito. No último par de horas andei a pesquisar no Google e a fazer experiências mas continuo muito confuso.

Não tenho dúvidas concretas, mas preciso de ajuda relativamente a compressão de conteúdo gerado pelo PHP. Alguém que perceba mais do assunto e que principalmente já tenha perdido tempo com isto, que já tenha usado portanto, que me dê umas luzes...

Mas por exemplo, assim à primeira vista, decidi optar pelo método que achava melhor. Usar um ficheiro .htaccess com o seguinte conteúdo:

php_flag zlib.output_compression on
php_value zlib.output_compression_level 9

Desta forma, todos os ficheiros PHP iriam ser comprimidos e isto iria funcionar muito bem para a forma como estou a fazer o output de toda a página, incluindo JavaScript e CSS. Mais abaixo irão perceber a ideia de como pretendia comprimir o output das páginas, JavaScript e CSS. No entanto, este método trás alguns problemas:

1) Acabei de testar o meu script num servidor online e não funcionou, como era um servidor com suporte para PHP5 um bocado para o rasca e era à borlix, algo me diz que os gajos bloqueram a modificação de opções do ficheiro ini do PHP através do .htaccess. E como este servidor, devem existir vários.

2) Queria evitar o uso do .htaccess pois imaginemos que o meu script será usado num servidor que não o Apache. Por exemplo, o IIS. Isto iria certamente não funcionar.

No entanto, localmente no meu portátil (Windows + Apache + PHP5) isto funcionou ás mil maravilhas.

Uma outra opção seria tentar usar à função ini_set() para mudar os parâmetros mas nos meus testes algo não funcionou e eu não percebi porquê. Todos os meus scripts, basicamente, agregam o conteúdo todo a ser escrito no browser para uma única variável (devido ao sistema de templates que uso, o mesmo que escrevi o artigo para a revista) e depois faço um simples echo dessa variável. O que eu tentei foi usar o ini_set()para definir tanto o "zlib.output_compression" para "On" como o "zlib.output_compression_level" para "9", mesmo antes de fazer echo da tal variável. Mas algo não bateu certo. Será que a syntaxe do ini_set() estava incorrecta? Refiro-me aos pontos, underscores, aspas e letras maiúsculas/minúsculas não sei se será sensível a este ponto. O que é certo é que não funcionou. Mas esta seria a melhor opção, a meu ver; pois iria funcionar em qualquer browser, sistema operativo e servidor, desde que tivesse activo o módulo zlib obviamente.

Encontrei também outra forma de o fazer, que era usando a função ob_start("ob_gzhandler"), mas:

1) Vi vários exemplos de código e não sei ao certo como usar. Quer dizer, eu consegui usar, mas, tinha várias linhas de código que eu não percebi bem para que eram e se eram realmente necessárias. Tentei comenta-las e o script funcionava na mesma e a página era comprimida, mas não sei até que ponto essas linhas comentadas seriam realmente importantes.

2) Segundo a documentação oficial do PHP, eles dizem o seguinte: "Note: You cannot use both ob_gzhandler() and zlib.output_compression. Also note that using  zlib.output_compression is preferred over ob_gzhandler().". O que evidentemente me deixa a pensar, e é por essa razão que gostava de tentar usar zlib.output_compression em vez do ob_gzhandler. Mas gostava também de perceber porquê que recomendam zlib em vez do ob_gzhandler.

Agora, a ideia é comprimir todo o output feito através de PHP, todos os ficheiros CSS e JavaScript. Quanto ao output gerado por PHP, é muito simples, todas as páginas do script são acedidas através do index.php e este, segundo os parâmetros da query, vai decidir qual a página que deve mostrar e depois é só fazer um echo do conteúdo. Relativamente ao CSS e ao Javascript, optei por criar dois ficheiros PHP, intitulados de scripts.php e styles.php. Ambos fazem praticamente o mesmo. No caso do scripts.php, ele agrega todo o conteúdo dos vários ficheiros .js existentes e necessários para a página corrente e faz um output deles. No styles.php, é feito praticamente a mesma coisa, com a diferença que apenas o conteúdo de um ficheiro .css é lido para então ser feito o output; mas se um dia tiver vários (por exemplo para compatibilidade com um browser especifico usando hacks, *cof*IE*cof*) irei agrega-los da mesma forma que faço para o JavaScript. O Content-Type é devidamente definido usando a função header() antes do output ser feito para ambos os tipos de ficheiros.

Bem, estou aberto a sugestões, mas mais importante a que me elucidem sobre a compressão de output em PHP. Espero que haja por ai alguém que já tenha usado compressão e que já tenha experiência neste campo.

P.S: Desculpem lá o testamento!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não acredito que com tanta gente neste fórum que programa em PHP ninguém me consegue ajudar... :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Lês-te o meu post todo? É que eu falei do que tu acabaste de postar, ou seja, o que essa página mostra é que tenho de alterar algumas directivas do php.ini e para eu fazer isso, apenas através do .htaccess, não é possível fazê-lo (ou eu não consegui) através de código com o ini_set(). E através do .htaccess isso só iria funcionar para o Apache, eu queria para uma forma generica onde funcionasse para todos os servidores web.

Lê o meu post que eu lá explico melhor todos os pormenores de usar esse método e porquê que não me serve...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois. Podes é tentar recorrer a uma lib externa para comprimir o output... Vou investigar isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas se há alguma lib externa deve dar para eu implementar directamente...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Experimenta isto:

if(/* o user mandou o gzip no Accept-Encoding*/){
    header("Content-Encoding: gzip");
    echo gzencode($output);
}else echo $output;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por acaso funcionou, thanks...

Agora só falta mesmo saber se isso não terá certas implicações e se devo fazer algumas verificações antes ou até mesmo adicionar uma opção onde o utilizador diga se pretende ou não activar a compressão.

Se mais alguém tiver ideias ou até mesmo comentários sobre o método do djthyrax, agradecia...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Agora só falta mesmo saber se isso não terá certas implicações e se devo fazer algumas verificações antes ou até mesmo adicionar uma opção onde o utilizador diga se pretende ou não activar a compressão.

Por isso mesmo é que pus ali aquele if. Se ele não confirmar que consegue ler gzip, vai haver problemas. Anyway, é sempre boa política dar a opção ao user de escolher, mas podes pôr activo como default :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, mas eu não estava a falar propriamente no facto de se o browser aceita ou não conteúdo comprimido mas noutro género de implicações que à primeira vista não reparamos...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, mas eu não estava a falar propriamente no facto de se o browser aceita ou não conteúdo comprimido mas noutro género de implicações que à primeira vista não reparamos...

Eu não estou a ver nenhuma.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso não significa que não haja... Ou tu conheces todos os ins e outs do PHP e de todas as suas funções? Sabes exactamente como funciona o que tu estás a fazer? E não estou a perguntar se supões como funciona, mas se sabes todos os ins e outs do que me sugeriste? Pode ter algum problema que há primeira vista não se vê/sabe, só isso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu disse que não estava a ver, não disse que não existia.

Anyway, do lado do servidor, não há qualquer problema desde que faças o header() antes de qualquer output, e não uses uma versão pré-histórica do PHP. A única coisa que pode acontecer é se houver um warning/error/notice/wtv e não tenhas nenhuma função definida como handler: ia fazer output sem estar comprimido e dava buraco...

Do lado do cliente, a única coisa que estou a ver é a falta de suporte a gzip no browser.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que ainda não percebeste a que me refiro... Mas também não sei como explicar melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora