Шаг 2. Наличие mod_deflate. Для этого можно создать любой php-файл со следующим содержимым:
<?
phpinfo();
?>
Затем вызываем и ищем, есть ли где-то включение «mod_deflate». Если да — переходим к шагу 5 для включения mod_deflate. Если нет — скорее всего, ваш хостер не поддерживает данное расширение и можно огорчиться. Но некоторое решение есть — сжимать файлы c помощью PHP.
Но мы сжали лишь сами страницы. А можно сжимать еще и js с css. Для этого архивируем их в gzip и ложим (подчеркну — не удалив старые) рядом со старыми в те же папки, а в корневом .htaccess прописываем:
Т.е. был файл templates/skin/new/js/panel.js, а рядом с ним получился templates/skin/new/js/panel.js.gzip У кого поддерживается gzip — теперь будет получать архив. JS можно еще сжать — см. шаг 4.
Шаг 4. Упаковка JS. На замечательном сервисе dean.edwards.name/packer/ вы можете добавить в верхнее окно исходный JS, поставить галочки base62, Shrink variables и получить по-максимуму сжатый JS-код. Экономия значительная. Единственное — не стоит упаковывать skin/templates/new/js/panel.js (почему-то не работает тогда).
Шаг 5. Настройка mod_deflate. Этот шаг нужен лишь тем, у кого есть mod_deflate, но он неправильно настроен. В корневой .htaccess прописываем:
Не нужно делать base62 и Shrink variables для javascript, достаточно просто сделать Pack (почистить от комментариев, пустых строк и т.д.) и gzip'ить. Тесты показывают, что закодированный js исполняется в браузере намного медленнее. Например, jQuery уже даже не поставляется в таком варианте. И, кроме того, закодированный вариант сжимается gzip даже немного хуже, чем просто почищенный. Да и «почему-то не работает тогда» тоже в таком случае возможен.
Сжатие есть хорошая вещь. Но, с одной стороны, вы экономите свой и чужой трафик, с другой — нагружаете сервер. Всё, как всегда, зависит от задач и условий.
Не работает через сжатие css и настройкой .htaccess… точнее передаются архив, но вот в заголовке нет упоминания того что это архив и FF пытается его открыть как обычный css или js… Кто-нибудь сталкивался с этим?
То ли баг, то ли фича, в общем один юзер прислал такое:
Notice: Undefined index: HTTP_TE in /velorama.net/include/gzip.php on line 22
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /velorama.net/include/gzip.php:22) in /velorama.net/classes/modules/sys_session/Session.class.php on line 53
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /velorama.net/include/gzip.php:22) in /velorama.net/classes/modules/sys_session/Session.class.php on line 53
Понятно, что нотисы можно отключить, что бы не мешало работе, но с этим хедером HTTP_TE что то сделать надо.
Теперь периодически валятся — по всей видимости что то надо поправить в Session.class.php, вопрос что?
[09-Июл-2009 06:47:05] PHP Notice: Undefined index: HTTP_TE in /home/h0sting/public_html/detsky-mir.com/include/gzip.php on line 22
[09-Июл-2009 06:47:05] PHP Warning: session_start() [function.session-start]: Cannot send session cookie — headers already sent by (output started at /home/h0sting/public_html/detsky-mir.com/include/gzip.php:22) in /home/h0sting/public_html/detsky-mir.com/classes/modules/sys_session/Session.class.php on line 53
[09-Июл-2009 06:47:05] PHP Warning: session_start() [function.session-start]: Cannot send session cache limiter — headers already sent (output started at /home/h0sting/public_html/detsky-mir.com/include/gzip.php:22) in /home/h0sting/public_html/detsky-mir.com/classes/modules/sys_session/Session.class.php on line 53
Ну вы даёте! Не только позаимствовали идею, но и клонировали домен у velorama.ru
Завтра покажу ваш прожект разработчикам оригинала, думаю им будет забавно полистать вашу подделку.
ЗЫ и названия разные «Велорама» и VELOrama это вообще по сути разные вещи. Велорама это рама от велосипеда (и сообщество велолюбителей), а VELOrama (заметь латиницей) — просто сообщество вело-любителей! Понимаешь, это два разных сообщества.
Всё верно, такой переменной нет. TE расшифровывается как transfer encoding. Это HTTP-заголовок, служащий для определения поддержки клиентом сжатия, аналог HTTP_ENCODING.
Может содержать в себе следующие признаки: deflate, gzip, chunked, identity, trailers
обобщила все это:
1. gzip.php — размещаем в /include/
<?php
// gzip.php v1.3 — убраны ошибки HTTP_TE, добавлено принудительное сжатие для IE
// released on 2004-05-06, by Roman Mamedov<roman at rm.pp.ru>
// license: do with this code whatever you want.
///// Configuration //////////////////
$PREFER_DEFLATE = false; // не нужно больше при желании можно поменять местами последние if elseif
$FORCE_COMPRESSION = false; // force compression even when client does not report support
$AE = 'undefined';
//////////////////////////////////////
function compress_output_gzip($output) {
return gzencode($output);
}
function compress_output_deflate($output) {
return gzdeflate($output, 9);
}
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']))
$AE = $_SERVER['HTTP_ACCEPT_ENCODING'];
elseif (isset($_SERVER['HTTP_TE']))
$AE = $_SERVER['HTTP_TE'];
else
if (isset($_SERVER['HTTP_USER_AGENT']) && stristr($_SERVER['HTTP_USER_AGENT'], 'msi'))
$FORCE_COMPRESSION = TRUE;
Это все конечно хорошо, спасибо за доработку для LS. Такой вопрос: если использую apache+nginx+eaccelerator+memcached в nginx настроено сжатие, подскажите пожалуйста есть ли смысл использовать web-optimizer или функционал из этого топика? Как бы не получилось дважды сжимать и т.д., может это уже лишнее для VPS? Есть ли смысл? Кто знает посоветуйте пожалуйста.
в данном виде эти две строки врятли будут работать, я лишь хотел показать что я имею ввиду. просто нет времени писать сложные регулярки, кто силен тот можете отписаться
для того чтобы вся эта кострукция заработала, нам необходимо весь css, js траффик пустить через index2.php. Делается это так:
RewriteRule ^(.*)\.(css|js)$ index2.php [L]
Вставить необходимо сразу под
RewriteEngine On
и вот что у нас получилось:
есть еще один момент чтобы ускорить работу сайта. в .htaccess можно добавить
Главная фишка моего подхода заключается в том, что у меня страницы грузятся если человек находится за проксей, а представленное решение топикстартера не позволяет этого сделать ссылаясь на HTTP_TE какое то…
44 комментария
Что это?
Понятно, что нотисы можно отключить, что бы не мешало работе, но с этим хедером HTTP_TE что то сделать надо.
[09-Июл-2009 06:47:05] PHP Notice: Undefined index: HTTP_TE in /home/h0sting/public_html/detsky-mir.com/include/gzip.php on line 22
[09-Июл-2009 06:47:05] PHP Warning: session_start() [
[09-Июл-2009 06:47:05] PHP Warning: session_start() [
Замчательная CMS я вам скажу =)
выдает такую ошибку и тест на whatsmyip.org/mod_gzip_test/ выдает, что страница не сжата…
Завтра покажу ваш прожект разработчикам оригинала, думаю им будет забавно полистать вашу подделку.
Другое дело что конечно c velorama.ru сделали на djem'e конечно гораздо круче)
всё логично — это два разных домена
Логика — весч мощная.
Видимо, должна быть)
Может содержать в себе следующие признаки: deflate, gzip, chunked, identity, trailers
1. gzip.php — размещаем в /include/
<?php
// gzip.php v1.3 — убраны ошибки HTTP_TE, добавлено принудительное сжатие для IE
// released on 2004-05-06, by Roman Mamedov<roman at rm.pp.ru>
// license: do with this code whatever you want.
///// Configuration //////////////////
$PREFER_DEFLATE = false; // не нужно больше при желании можно поменять местами последние if elseif
$FORCE_COMPRESSION = false; // force compression even when client does not report support
$AE = 'undefined';
//////////////////////////////////////
function compress_output_gzip($output) {
return gzencode($output);
}
function compress_output_deflate($output) {
return gzdeflate($output, 9);
}
if (isset($_SERVER['HTTP_ACCEPT_ENCODING']))
$AE = $_SERVER['HTTP_ACCEPT_ENCODING'];
elseif (isset($_SERVER['HTTP_TE']))
$AE = $_SERVER['HTTP_TE'];
else
if (isset($_SERVER['HTTP_USER_AGENT']) && stristr($_SERVER['HTTP_USER_AGENT'], 'msi'))
$FORCE_COMPRESSION = TRUE;
$support_gzip = (strpos($AE, 'gzip') !== FALSE) || $FORCE_COMPRESSION;
$support_deflate = (strpos($AE, 'deflate') !== FALSE) || $FORCE_COMPRESSION;
if ($support_gzip) {
header(«Content-Encoding: gzip»);
ob_start(«compress_output_gzip»);
}
elseif ($support_deflate) {
header(«Content-Encoding: deflate»);
ob_start(«compress_output_deflate»);
}
else ob_start();
?>
2. в .htaccess добавляем
AddEncoding gzip .gz
RewriteCond %{HTTP:Accept-encoding} gzip
RewriteCond %{HTTP_USER_AGENT} !Safari
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule ^(.*)$ $1.gz [QSA,L]
3. выполняем в директории LS:
for f in `find. -name *.js`; do gzip -c $f > $f.gz; done;
for f in `find. -name *.css`; do gzip -c $f > $f.gz; done;
процедуру необходимо повторять после обновления затрагивающих *.js или *.css
Теоретически проблем быть не должно.
ps: возможно в .htaccess надо добавить включение правила для IE?
в index.php после
пишем
и готово. что касается самих js/css файлов.
тут тоже ничего страшного нет:
создаем файл index2.php и в нем пишем следующее:
сюда можно еще многое добавить, например вырезать из output пустые строки и/или перевод каретки и/или комментарии:
в данном виде эти две строки врятли будут работать, я лишь хотел показать что я имею ввиду. просто нет времени писать сложные регулярки, кто силен тот можете отписаться
для того чтобы вся эта кострукция заработала, нам необходимо весь css, js траффик пустить через index2.php. Делается это так:
Вставить необходимо сразу под
и вот что у нас получилось:
есть еще один момент чтобы ускорить работу сайта. в .htaccess можно добавить
Это кеширование по типу файла, очень хорошая вещь для массового браузерного кеша.
p.s. и, уважаемые программисты, не ставьте знак ?> в конце файла, это сэкономит не только размеры файлов, но и многие часы дебага
p.s.s в данный момент подготавливаю большой модуль «галерея изображений» ждите.
результат работы строки