Сжатие страниц, JS и CSS на сервере, где нет gzip и deflate

05 Июл 2008
Опубликовано VladSavitsky

Решение

Будем сжимать все своими силами.

Необходимые условия

  • хостер не включил gzip и deflate сжатие
  • должен быть доступ к файлу .htaccess
  • ваш php должен иметь поддержку функции gzencode (PHP 4+)
  • обязательно должны быть включены "Чистые ссылки", это когда в url нет "?q="

Сжатие страничек

В корне сайта лежит файл index.php - открываем его и ищем строчку:

print theme('page', $return);

сразу перед ней вставляем команду:
"ob_start("ob_gzhandler");"

Почему это делается не в page.tpl.php?
Да потому, что нужно, чтобы и служебные странички выводились сжатыми, и на сайте была возможность выбирать свою тему оформления. А добавлять эту строку во все темы - слишком долго...

Итак, теперь все страницы сайта браузер получает сжатыми.

Объединение CSS и JS

Открываем страницу "Производительность" (admin/settings/performance) и включаем "Объединение и сжатие файлов CSS". Таким образом все CSS-файлы будут объедены в один. Так как мы знаем, что наш хостинг не дает сжимать, то все равно на выходе будет пусть и один, но пока не сжатый CSS файл.

В Drupal 6 включаем объединение и ява-скриптов, что умее и само ядро с 6 версии, но вот 5 друпал такого еще не умеет, поэтому надо исправить это - для этого устанавливаем модуль "Javascript Aggregator" (http://drupal.org/project/javascript_aggregator). Настраиваем его как указано в readme. Теперь на /admin/settings/performance появились опции для объединения JS-файлов и под 5.

В результате при запросе страницы браузер получает:

  1. HTML-cтраница (сжатая)
  2. Один css-файл (не сжатый )
  3. Один JS-файл (не сжатый )
  4. Графические файлы

Теперь надо сжать эти CSS и JS...

Сжатие CSS и JS

Нам будет нужен модуль SmartCache (есть версия для Drupal 5 и 6).

Скачиваем его и настраиваем.

  1. Создаем в /modules/ папку "smartcache"
  2. Загружаем файл "load.php" из скаченного архива в /modules/smartcache/
  3. Создаем в в /modules/smartcache/ новую папку 'cache' т.е. /modules/smartcache/cache
  4. Устанавливаем на папку cache права 775

Проверяем как работает сжатие

Нужно открыть в браузере: http://example.com/modules/smartcache/load.php?file=misc/drupal.js
Если вы видите обычный js, то все работает как нужно.
Если же нет, то придется почитать readme.txt из состава модуля.

И так, если мы увидели этот скрипт, то идем дальше.
Открываем .htaccess из корня сайта ищем последнюю строчку с "RewriteRule" и после нее вставляем код:

  RewriteRule ^(.*\.((js)|(css)))$ /modules/smartcache/load.php?file=$1
  RewriteRule \.css$ /modules/smartcache/load.php?file=$1
  RewriteRule \.js$ /modules/smartcache/load.php?file=$1

Незнаю почему, но он у меня "из коробки" не захотел сжимать собранные модулями файлы, т.е. при включении объединения css и js уходили без сжатия, как только выключал объединение - все уходили сжатыми, но только CSS было более 10 =(. Поэтому помимо правила из readme добавил еще 2 последних правила

Также, если в .htaccess из папки "files" есть правило:
RewriteEngine on
то удаляем его, именно это правило не дает срабатывать необходмым правилам и получать сжатые файлы.

Что имеем на выходе

  • Все странички сжимаются средствами php при каждом обращении (ну не дал хостер нам возможность сжимать средствами Apache).
  • Все CSS и JS тоже сжимаются посредством php. Но! Сжатые варианты складываются в папку cache и если такой уже есть - то берется именно сжатая версия, а не сжимается снова.
  • Также устанавливаются необходимые заголовки для файлов, что в сумме снижает нагрузку на сервер.

Теперь у вас есть новое развлечение - чистить эту папку, если что-то меняется в теме сайта!...

Браузеры, которые не работают со сжатыми страницами

"ob_start("ob_gzhandler");" сжимает страничку не всегда - а когда браузер выдал что он поддерживает сжатие. Так что обиженных будет не так много, разве что совсем старые версии браузеров, да некоторые Safari (не проверял, но читал) тоже неверно работают со сжатыми страничками.

Использованные материалы

Полезные ссылки

  • Что такое Gzip - раскрывается сам термин gzip (с кучей линков по теме), а также есть несколько тестов для проверки ваших страниц. (подсказал:Sky Cat)
 
 
 

RSS-лента новостей

Dries Buytaert по-русски
]]>Русский поиск Drupal]]>

Перенос сайта из Joomla в Drupal
Перенос сайта из WordPress в Drupal

]]> Drupal - это бесплатная система управления контентом с открытым исходным кодом ]]>