Melhor forma de comprimir output gerado por PHP

Nazgulled

Power Member
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:
Código:
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!
 
Back
Topo