Сжатие страничек, js и css на хостинге где нет gzip и deflate

Главные вкладки

Аватар пользователя Shedko Shedko 5 июля 2008 в 14:50

[float=left] Сжатый Drupal =)[/float]

Попался под руку сайт, где мало того, что стоял 5 друпал, где нет объединения ява-скриптов, так еще и сжатие было выключено, хостер сказал что не будет включать возможность сжатия, так как ему это не выгодно Smile .

Ну ладно, будем сжимать все сами.

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

Сжатие страничек
Странички сжать легко до безумия, в корне сайта лежит файлик index.php - открываем его и ищем строчку:
"print theme('page', $return);"

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

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

И так - теперь все странички уходят сжатыми.

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

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

После всего проделанного у на при запросе странички уходят только:
1. сама страничка (уже сжатая)
2. один css (еще не сжатый )
3. один JS (еще не сжатый )
4. графические файлы

Теперь надо сжать эти jss и js.

Сжатие CSS и JS
И вот тут нам поможет модуль SmartCache (http://drupal.org/project/smartcache) есть для 5 и 6 Drupal.

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

Проверяем как работает это сжатие открытием странички:
http://ВАШ_САЙТ/modules/smartcache/load.php?file=misc/drupal.js
если вы увидили обычный js - то все прошло как надо Smile , если же нет - то придется почитать 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 и каждый раз Sad ну что поделать - ну не дал хостер нам возможность сжимать средствами апача.

Все css и js тоже сжимаются посредством php НО, сжатые варианты складываются в папку cache и если такой уже есть - то берется именно сжатая версия, а не сжимается по новой. Также устанавливаются необходимые заголовки для файлов, что в сумме снижает нагрузку на сервер.
Но теперь у нас есть новое развлечение - иногда чистить эту папку, если часто меняем оформление.

Вроде все.

P.S.
писал скорее для себя, чтоб потом не забыть что и как делал Smile

__________________________
Зачем только встроен поиск, если задаются одни и теже вопросы ?

Комментарии

Аватар пользователя VladSavitsky VladSavitsky 5 июля 2008 в 16:04

А я так и не добил эту тему. Натыкался на решение сжимать средствами PHP, но так и не попробовал.
Вместо сжатия CSS и JS модулем я думал использовать сжатие по крону системными архиваторами - скриптик написать для этого нужно было...
Спасибо за статью. Всё очень понятно и логично.

Аватар пользователя Shedko Shedko 7 июля 2008 в 17:21

А сапе все равно Smile

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

Аватар пользователя Lynxlab Lynxlab 8 июля 2008 в 13:39

Отличное решение, но общий подход мне кажется неверным - отказываться нужно от какого хостинга. Сегодня хостер придумал одни ограничения, завтра появятся новые - это во первых, а во вторых - себя надо любить и уважать, а не под хост-дудку плясать. Также подобный отказ будет способствовать конкуренции (т.е. включению мозгов этого самого хостера).
Извиняюсь за резкость, но не мог промолчать.

Аватар пользователя oblivion oblivion 9 июля 2008 в 12:45

интересно посмотреть бы результаты тестов, сколько выигруем времени
и еще, а если еще и настроить gzip сжатие?

Аватар пользователя Sky Cat Sky Cat 11 июля 2008 в 3:11

ibragim wrote:
интересно посмотреть бы результаты тестов, сколько выигруем времени
и еще, а если еще и настроить gzip сжатие?

Смысла особого не будет. По крайней мере, при одновременном использовании mod_gzip и "ob_start("ob_gzhandler");"
Вот тут раскрывается сам термин gzip (с кучей линков по теме), а также есть несколько тестов для проверки ваших страниц.

Аватар пользователя drudds drudds 10 июля 2008 в 14:28

Shedko wrote:

Все css и js тоже сжимаются посредством php НО, сжатые варианты складываются в папку cache и если такой уже есть - то берется именно сжатая версия, а не сжимается по новой. Также устанавливаются необходимые заголовки для файлов, что в сумме снижает нагрузку на сервер.
Но теперь у нас есть новое развлечение - иногда чистить эту папку, если часто меняем оформление.


Спасибо за статью!
А какое-нибудь логирование есть у этого smartcacheб а то почему у меня ни скрипты, ни цсс в папку не складываются Sad А так же переодически вижу, что не сжимаются:(

Аватар пользователя Shedko Shedko 13 июля 2008 в 22:30

untitledds wrote:
А какое-нибудь логирование есть у этого smartcacheб а то почему у меня ни скрипты, ни цсс в папку не складываются Sad А так же переодически вижу, что не сжимаются:(

Да есть и отладочный режим. Удаляем те строчки что добавили в .htaccess из корня сайта. Незачем посетителям видеть что мы проверяем скрипты Smile

В файле "load.php " на 36 строке включение режима отладки.
$debug = FALSE; <- так выключено
$debug = TRUE; <- так включено

Когда выключен режим отладки, то будет просто выдаваться либо 404 или 500 ошибки сервера и никаких сообщений.

Если же мы включим режим отладки, и откроем ссылку "http://ВАШ_САЙТ/modules/smartcache/load.php?file=misc/drupal.js" мы увидим что за ошибка происходит.

Исправляем ошибки и опять "$debug = FALSE; " и возвращаем строчки в .htaccess

Аватар пользователя Bazel Bazel 6 сентября 2010 в 0:37

Сам обыскался решением по gzip сжатию. В конце концов пришлось собрать свое решение - проверено и работает на нескольких сайтах - так что пользоваться можно ) - оформил в виде статьи Сжатие CSS и JS с помощью gzip.