Попался под руку сайт, где мало того, что стоял 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" и на новой строчке после нее вставляем три новых строчки:
Незнаю почему, но он у меня "из коробки" не захотел сжимать собранные модулями файлы, т.е. при включении объединения css и js уходили без сжатия, как только выключал объединение - все уходили сжатыми, но только CSS было более 10 =(. Поэтому помимо правила из readme добавил еще 2 последних правила
Также если в .htaccess из папки "files" есть правило
RewriteEngine on
то удаляем его, именно это правило не дает срабатывать необходмым правилам и получать сжатые файлы.
Что имеем на выходе:
Все странички сжимаются средствами php и каждый раз ну что поделать - ну не дал хостер нам возможность сжимать средствами апача.
Все css и js тоже сжимаются посредством php НО, сжатые варианты складываются в папку cache и если такой уже есть - то берется именно сжатая версия, а не сжимается по новой. Также устанавливаются необходимые заголовки для файлов, что в сумме снижает нагрузку на сервер.
Но теперь у нас есть новое развлечение - иногда чистить эту папку, если часто меняем оформление.
Вроде все.
P.S.
писал скорее для себя, чтоб потом не забыть что и как делал
__________________________
Зачем только встроен поиск, если задаются одни и теже вопросы ?
Комментарии
А я так и не добил эту тему. Натыкался на решение сжимать средствами PHP, но так и не попробовал.
Вместо сжатия CSS и JS модулем я думал использовать сжатие по крону системными архиваторами - скриптик написать для этого нужно было...
Спасибо за статью. Всё очень понятно и логично.
Пригодится. Спасибо!
Решение было сохранено на сайте DrupalCookBook.ru:
Сжатие страниц, JS и CSS на сервере, где нет gzip и deflate.
Авторы, предложившие решения, также указаны в сохранённой статье.
И так - теперь все странички уходят сжатыми.
..................
Это прекрасно, но что делать людям с браузерами без поддержки сжатия?
спасибо, полезно
По хорошему нужно проверять может ли браузер получать сжатые страницы в htaccess и отдавать то, что нужно.
А сапе все равно
Дело в том, что "ob_start("ob_gzhandler");" сжимает страничку не всегда - а когда браузер выдал что он поддерживает сжатие. Так что сапа - грузит и радуется и обиженных будет не так много, разве что совсем старые версии браузеров, да некоторые Safari (не проверял, но читал) тоже неверно работают со сжатыми страничками.
Отличное решение, но общий подход мне кажется неверным - отказываться нужно от какого хостинга. Сегодня хостер придумал одни ограничения, завтра появятся новые - это во первых, а во вторых - себя надо любить и уважать, а не под хост-дудку плясать. Также подобный отказ будет способствовать конкуренции (т.е. включению мозгов этого самого хостера).
Извиняюсь за резкость, но не мог промолчать.
Хороший рецепт. В мемориз однозначно.
интересно посмотреть бы результаты тестов, сколько выигруем времени
и еще, а если еще и настроить 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
Сам обыскался решением по gzip сжатию. В конце концов пришлось собрать свое решение - проверено и работает на нескольких сайтах - так что пользоваться можно ) - оформил в виде статьи Сжатие CSS и JS с помощью gzip.