Apache/2.2.20 (Ubuntu 11.10) сжатие gzip не будет работать на страницах php, содержимое разбито на части

У меня проблема с новым рабочим сервером, на который я переношу проекты. HTML-вывод PHP-приложений не сжимается модулем Apache mod_deflate. Другие ресурсы, такие как таблицы стилей и файлы javascript, даже html-страницы, которые обслуживаются тем же типом контента (text / html), что и выходные данные PHP, сжимаются!

Проекты используют следующие правила (из шаблона HTML5) в.htaccess:


  # Force deflate для искаженных заголовков developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping/
  
    
      SetEnvIfNoCase ^ (Accept-EncodXng | X-cept-Encoding | X {15} | ~ {15} | - {15}) $ ^ ((gzip | deflate) \ s *,? \ S *)+|[X~-]{4,13}$ HAVE_Accept-Encoding
      RequestHeader добавить Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
    
  

  # HTML, TXT, CSS, JavaScript, JSON, XML, HTC:
  
    FilterDeclare COMPRESS
    FilterProvider COMPRESS DEFLATE resp = Тип содержимого $text/html
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $text/css
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/plain
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $text/xml
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $text/x-component
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $application/javascript
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $application/json
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $application/xml
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $application/xhtml+xml
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $application/rss+xml
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $application/atom+xml
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $application/vnd.ms-fontobject
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $image/svg+xml
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $image/x-icon
    FilterProvider  COMPRESS  DEFLATE resp= Тип содержимого $application/x-font-ttf
    FilterProvider  COMPRESS  DEFLATE resp=Content-Type $font/opentype
    FilterChain     COMPRESS
    FilterProtocol  COMPRESS  DEFLATE изменить = да; байтов = нет
  
                                                                                                                                                                  

У нас есть тестовая машина, которая работает с той же версией Apache, OS и PHP. На этой машине сжатие прекрасно работает на выходе PHP. Насколько я могу судить, я проверил и сравнил конфигурационные файлы Apache и PHP.

Я пробовал несколько способов вывода содержимого PHP, используя буферизацию вывода или просто отображая содержимое. То же самое, без сжатия.

Пример заголовка ответа вывода PHP:

HTTP / 1.1 200 ОК
Дата: среда, 25 апреля 2012 г. 23:30:59 по Гринвичу
Сервер: Apache
Accept-Ranges: байты
Истекает: четверг, 19 ноября 1981 года, 08:52:00 по Гринвичу
Cache-Control: общедоступный
Прагма: без кеша
Варь: Пользователь-агент
Keep-Alive: тайм-аут =5, максимум =98
Подключение: Keep-Alive
Передача-кодировка: чанки
Content-Type: text/html; кодировка = UTF-8

Пример заголовка ответа в файле CSS:

HTTP / 1.1 200 ОК
Дата: среда, 25 апреля 2012 г. 23:30:59 по Гринвичу
Сервер: Apache
Дата последнего изменения: понедельник, 04 июля 2011 19:12:36 GMT
Варьируется: Accept-Encoding,User-Agent
Контент-кодировка: gzip
Cache-Control: общедоступный
Истекает: пт, 25 мая 2012 23:30:59 GMT
Контент-длина: 714
Keep-Alive: тайм-аут =5, максимум =100
Подключение: Keep-Alive
Тип контента: текст / CSS; кодировка = UTF-8

У кого-нибудь есть подсказка или опытная такая же "проблема"?

Спасибо!

2 ответа

Если Apache не может определить, насколько велик возвращаемый контент, он автоматически прибегнет к кусочному кодированию. В зависимости от того, как выполняется ваш PHP-скрипт (CGI, FastCGI и т. Д.), Apache может не знать размер контента, когда он начинает возвращать его пользователю. То есть, если он выводит содержимое по всему сценарию, он может немедленно записать эти данные в буфер клиента.

Причина, по которой он работает со статическими файлами, заключается в том, что Apache знает их размер, когда начинает возвращать его. Это может указывать на проблему с вашей конфигурацией Apache/PHP (т. Е. Она начинает записывать момент, когда выходные данные возвращаются из скрипта), или из-за того, как работает ваш скрипт.

Другими словами, это звучит как проблема с PHP или вашим коннектором Apache/PHP, а не с mod_deflate,

Пожалуйста, проверьте, включено ли сжатие вывода PHP. Это можно сделать в файле php.ini или с помощью директивы времени выполнения. Проверьте документацию для более подробной информации.

Другие вопросы по тегам