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

Прислано: Shedko

сб, 05/07/2008 - 10:50

Другие статьи по теме:

Сжатый Drupal =)

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

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

Необходимые условия
- хостер не включил 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 файл, но мы это исправим =).

Для тех у кого 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 - то все прошло как надо =) , если же нет - то придется почитать 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 и каждый раз =( ну что поделать - ну не дал хостер нам возможность сжимать средствами апача.

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

Вроде все.

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

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

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано VladSavitsky в сб, 05/07/2008 - 12:04.

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


Опубликовано Dimm в сб, 05/07/2008 - 14:43.

Пригодится. Спасибо!


Опубликовано VladSavitsky в сб, 05/07/2008 - 19:30.

Drupal CookBook - Готовить может каждый!Решение было сохранено на сайте DrupalCookBook.ru:
Сжатие страниц, JS и CSS на сервере, где нет gzip и deflate.
Авторы, предложившие решения, также указаны в сохранённой статье.


Опубликовано Химический Али в вс, 06/07/2008 - 12:20.

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

Это прекрасно, но что делать людям с браузерами без поддержки сжатия?


Опубликовано Valeratal в вс, 06/07/2008 - 14:30.

спасибо, полезно


Опубликовано vitich в пн, 07/07/2008 - 08:33.

Пример такого браузера?


Опубликовано vitich в пн, 07/07/2008 - 08:35.

Интересно, а бот сапы сумеет сжатые страницы со ссылками скушать? )


Опубликовано VladSavitsky в пн, 07/07/2008 - 09:46.

По хорошему нужно проверять может ли браузер получать сжатые страницы в htaccess и отдавать то, что нужно.


Опубликовано Shedko в пн, 07/07/2008 - 13:21.

А сапе все равно =)

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


Опубликовано Lynxlab в вт, 08/07/2008 - 09:39.

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


Опубликовано kuroki_kaze в вт, 08/07/2008 - 11:27.

Хороший рецепт. В мемориз однозначно.


Опубликовано oblivion в ср, 09/07/2008 - 08:45.

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


Опубликовано drudds в чт, 10/07/2008 - 10:28.

Shedko написал(а):

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

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


Опубликовано Sky Cat в чт, 10/07/2008 - 23:11.

ibragim написал(а):

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

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


Опубликовано Shedko в вс, 13/07/2008 - 18:30.

untitledds написал(а):

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

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

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

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

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

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


Новое на сайте