Jump to content

Melhor forma de comprimir output gerado por PHP


Guest id194
 Share

Recommended Posts

Guest id194

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!

Link to comment
Share on other sites

Guest id194

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

Link to comment
Share on other sites

Experimenta isto:

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

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

Guest id194

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

Link to comment
Share on other 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 😛

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

Guest id194

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

Link to comment
Share on other 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.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

Guest id194

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

Link to comment
Share on other 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.

Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.