Сжатие страничек, js и css на хостинге где нет gzip и deflate
Прислано: Shedko
сб, 05/07/2008 - 10:50
Попался под руку сайт, где мало того, что стоял 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.
писал скорее для себя, чтоб потом не забыть что и как делал =)
__________________________
Зачем только встроен поиск, если задаются одни и теже вопросы ?
- Shedko's blog
- Для комментирования войдите или зарегистрируйтесь
А я так и не добил эту тему. Натыкался на решение сжимать средствами PHP, но так и не попробовал.
Вместо сжатия CSS и JS модулем я думал использовать сжатие по крону системными архиваторами - скриптик написать для этого нужно было...
Спасибо за статью. Всё очень понятно и логично.
- Для комментирования войдите или зарегистрируйтесь
Пригодится. Спасибо!
- Для комментирования войдите или зарегистрируйтесь
Решение было сохранено на сайте DrupalCookBook.ru:
Сжатие страниц, JS и CSS на сервере, где нет gzip и deflate.
Авторы, предложившие решения, также указаны в сохранённой статье.
- Для комментирования войдите или зарегистрируйтесь
И так - теперь все странички уходят сжатыми.
..................
Это прекрасно, но что делать людям с браузерами без поддержки сжатия?
- Для комментирования войдите или зарегистрируйтесь
спасибо, полезно
- Для комментирования войдите или зарегистрируйтесь
Пример такого браузера?
- Для комментирования войдите или зарегистрируйтесь
Интересно, а бот сапы сумеет сжатые страницы со ссылками скушать? )
- Для комментирования войдите или зарегистрируйтесь
По хорошему нужно проверять может ли браузер получать сжатые страницы в htaccess и отдавать то, что нужно.
- Для комментирования войдите или зарегистрируйтесь
А сапе все равно =)
Дело в том, что "ob_start("ob_gzhandler");" сжимает страничку не всегда - а когда браузер выдал что он поддерживает сжатие. Так что сапа - грузит и радуется =) и обиженных будет не так много, разве что совсем старые версии браузеров, да некоторые Safari (не проверял, но читал) тоже неверно работают со сжатыми страничками.
- Для комментирования войдите или зарегистрируйтесь
Отличное решение, но общий подход мне кажется неверным - отказываться нужно от какого хостинга. Сегодня хостер придумал одни ограничения, завтра появятся новые - это во первых, а во вторых - себя надо любить и уважать, а не под хост-дудку плясать. Также подобный отказ будет способствовать конкуренции (т.е. включению мозгов этого самого хостера).
Извиняюсь за резкость, но не мог промолчать.
- Для комментирования войдите или зарегистрируйтесь
Хороший рецепт. В мемориз однозначно.
- Для комментирования войдите или зарегистрируйтесь
интересно посмотреть бы результаты тестов, сколько выигруем времени
и еще, а если еще и настроить gzip сжатие?
- Для комментирования войдите или зарегистрируйтесь
Все css и js тоже сжимаются посредством php НО, сжатые варианты складываются в папку cache и если такой уже есть - то берется именно сжатая версия, а не сжимается по новой. Также устанавливаются необходимые заголовки для файлов, что в сумме снижает нагрузку на сервер.
Но теперь у нас есть новое развлечение - иногда чистить эту папку, если часто меняем оформление.
Спасибо за статью!
А какое-нибудь логирование есть у этого smartcacheб а то почему у меня ни скрипты, ни цсс в папку не складываются :( А так же переодически вижу, что не сжимаются:(
- Для комментирования войдите или зарегистрируйтесь
интересно посмотреть бы результаты тестов, сколько выигруем времени
и еще, а если еще и настроить gzip сжатие?
Смысла особого не будет. По крайней мере, при одновременном использовании mod_gzip и "ob_start("ob_gzhandler");"
Вот тут раскрывается сам термин gzip (с кучей линков по теме), а также есть несколько тестов для проверки ваших страниц.
- Для комментирования войдите или зарегистрируйтесь
А какое-нибудь логирование есть у этого smartcacheб а то почему у меня ни скрипты, ни цсс в папку не складываются :( А так же переодически вижу, что не сжимаются:(
Да есть и отладочный режим. Удаляем те строчки что добавили в .htaccess из корня сайта. Незачем посетителям видеть что мы проверяем скрипты =)
В файле "load.php " на 36 строке включение режима отладки.
$debug = FALSE; <- так выключено
$debug = TRUE; <- так включено
Когда выключен режим отладки, то будет просто выдаваться либо 404 или 500 ошибки сервера и никаких сообщений.
Если же мы включим режим отладки, и откроем ссылку "http://ВАШ_САЙТ/modules/smartcache/load.php?file=misc/drupal.js" мы увидим что за ошибка происходит.
Исправляем ошибки и опять "$debug = FALSE; " и возвращаем строчки в .htaccess
- Для комментирования войдите или зарегистрируйтесь











Комментарии