Apache / 2.2.20 (Ubuntu 11.10) A compactação gzip não funciona em páginas php, o conteúdo é fragmentado

5

Estou com um problema com um novo servidor de produção para o qual estou transferindo projetos. A saída HTML dos aplicativos PHP não é compactada pelo módulo mod_deflate do Apache. Outros recursos, como arquivos de estilo e javascript, até mesmo páginas html, que são servidos com o mesmo tipo de conteúdo (text / html) que a saída do PHP, são compactados!

Os projetos usam as seguintes regras (do boilerplate HTML5) no .htaccess:

<IfModule mod_deflate.c>
  # Force deflate for mangled headers developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
  <IfModule mod_setenvif.c>
    <IfModule mod_headers.c>
      SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
      RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
    </IfModule>
  </IfModule>

  # HTML, TXT, CSS, JavaScript, JSON, XML, HTC:
  <IfModule filter_module>
    FilterDeclare   COMPRESS
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/html
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/css
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/plain
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/x-component
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/javascript
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/json
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/xhtml+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/rss+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/atom+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/vnd.ms-fontobject
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $image/svg+xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $image/x-icon
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $application/x-font-ttf
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $font/opentype
    FilterChain     COMPRESS
    FilterProtocol  COMPRESS  DEFLATE change=yes;byteranges=no
  </IfModule>
 </IfModule>                                                                                                                                                                 

Nós temos uma máquina de testes que executa a mesma versão do Apache, OS e PHP. Nessa máquina, a compactação funciona muito bem na saída do PHP. Eu verifiquei e comparei os arquivos de configuração do Apache e do PHP, da mesma forma que eu sei.

Eu tentei várias maneiras de gerar o conteúdo do PHP, usando buffer de saída ou simplesmente fazendo eco do conteúdo. Mesma coisa, sem compressão.

Exemplo de cabeçalhos de resposta de uma saída do PHP:

HTTP/1.1 200 OK
Date: Wed, 25 Apr 2012 23:30:59 GMT
Server: Apache
Accept-Ranges: bytes
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: public
Pragma: no-cache
Vary: User-Agent
Keep-Alive: timeout=5, max=98
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8

Exemplo de cabeçalhos de resposta em um arquivo css:

HTTP/1.1 200 OK
Date: Wed, 25 Apr 2012 23:30:59 GMT
Server: Apache
Last-Modified: Mon, 04 Jul 2011 19:12:36 GMT
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Cache-Control: public
Expires: Fri, 25 May 2012 23:30:59 GMT
Content-Length: 714
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/css; charset=utf-8

Alguém tem uma pista ou experimentou o mesmo "problema"?

obrigado!

    
por FamousInteractive 26.04.2012 / 01:39

2 respostas

1

Se o Apache não souber o tamanho do conteúdo retornado, ele recorrerá automaticamente a ele codificação . Dependendo de como seu script PHP está sendo executado (CGI, FastCGI, etc.), o Apache pode não saber o tamanho do conteúdo quando ele começa a retorná-lo ao usuário. Ou seja, se você gerar conteúdo em todo o script, ele poderá gravar esses dados no buffer do cliente imediatamente.

O motivo pelo qual ele trabalha com arquivos estáticos é porque o Apache sabe o tamanho deles quando começa a retorná-lo. Isso pode apontar para um problema com sua configuração do Apache / PHP (por exemplo, começa a escrever no momento em que a saída é retornada do script) ou em como o próprio script funciona.

Em outras palavras, isso soa como um problema com o PHP ou seu conector Apache / PHP, não com mod_deflate .

    
por 26.04.2012 / 01:55
-1

Por favor, verifique se a compressão da saída do PHP está ativada. Isso pode ser feito no arquivo php.ini ou por meio de uma diretiva de tempo de execução. Verifique a documentação para obter mais detalhes.

    
por 26.04.2012 / 11:43