По причине отсутствия на хостинге mod_gzip, пришлось реализовывать компрессию css и js через статическое сжатие. С другой стороны, может оно так и лучше… Но, сразу же возникает одно но. Проводить подобную операцию вручную хоть и можно, но крайне не производительно, желательно все это автоматизировать. Вот один из простеньких вариантов подобной автоматизации, реализованный на php, здесь и показан.
Для начала разберемся с поставленной задачей. Имеется локальная версия сайта (Apache, php), активно изменяемая и корректируемая. В процессе работы мы должны иметь сжатые версии css и js файлов (готовый результат при тестировании надо видеть сразу).
Значит нам надо:
Конечно, сюда не сложно добавить и объединение файлов, если нужно, но здесь речь идет не об этом…
Итак, создадим страницу php (назовем ее, например, ready.php), в которой и будет находиться весь нужный нам код. Открыв эту страницу в браузере, мы запустим процесс компрессии. Если сайт динамически собирается на php, то можно прописать include('ready.php') и по мере надобности сжатие будет проводиться автоматически. Само собой, адрес в include() надо прописать реальный. Тут есть один нюанс, для предотвращения вызова этого файла на хостинге (реально на хостинге его может не быть, а вот строчку можно и забыть стереть), можно прописать некое уникальное для локального сервера условие, например:
Адрес корневой папки у вас и на сервере вряд ли совпадет, но можно придумать и что-то другое…
В ready.php пишем такой php код:
В результате получаем сжатые копии всех js и css файлов с именами типа name.gzip.js и name.gzip.css (если нет, то для начала, проверяем правильность адреса и права доступа).
Дальше надо обеспечить отдачу севером актуальной версии файла (без оглядки на кэш). Делается это через добавление к имени файла метки filemtime. На php это реализуется стандартно, например:
Готовая ссылка должна быть такого типа:
Это уже не раз обсуждалось и подробности можно найти по запросу, например, «разгони свой сайт, практический css/js»…
В файл htaccess добавляем правила переадресации (сразу учитываем и наличие сжатой версии):
Вот и все.
В результате, мы продолжаем комфортно работать с js и css файлами и при этом, всегда имеем их сжатые версии, которые и скармливаются браузеру.
Для начала разберемся с поставленной задачей. Имеется локальная версия сайта (Apache, php), активно изменяемая и корректируемая. В процессе работы мы должны иметь сжатые версии css и js файлов (готовый результат при тестировании надо видеть сразу).
Значит нам надо:
- Найти все файлы css и js (даже если они находятся во вложенных папках)
- Создать сжатую версию (причем не каждый раз, а только если файл был изменен)
- Реализовать автоматическую отдачу сервером актуальной версии файла (в сжатом виде, если это поддерживает браузер)
Конечно, сюда не сложно добавить и объединение файлов, если нужно, но здесь речь идет не об этом…
Итак, создадим страницу php (назовем ее, например, ready.php), в которой и будет находиться весь нужный нам код. Открыв эту страницу в браузере, мы запустим процесс компрессии. Если сайт динамически собирается на php, то можно прописать include('ready.php') и по мере надобности сжатие будет проводиться автоматически. Само собой, адрес в include() надо прописать реальный. Тут есть один нюанс, для предотвращения вызова этого файла на хостинге (реально на хостинге его может не быть, а вот строчку можно и забыть стереть), можно прописать некое уникальное для локального сервера условие, например:
if (mb_eregi("адрес локальной корневой папки", $_SERVER['DOCUMENT_ROOT'])) { include('ready.php '); }
Адрес корневой папки у вас и на сервере вряд ли совпадет, но можно придумать и что-то другое…
В ready.php пишем такой php код:
function ready($dir) { $dir = $_SERVER['DOCUMENT_ROOT'].$dir; $ext = array("js","css"); for($i = 0; $i < count($ext); $i++) { search($dir , $ext[$i]); } } function search($dir , $ext) { $dirH = opendir($dir); while (($file = readdir($dirH)) !== false) { if ($file != "." && $file != ".." && !mb_eregi(".gzip", $file)) { if (filetype($dir.$file) == "dir") { search($dir.$file."/", $ext); } else { if (fnmatch("*.".$ext, $file)) { if (!mb_eregi("gzip", $file)) { // следующая строка покажет все найденные файлы //print $dir.$file."<br>"; $adr = substr($dir.$file, 0, strrpos($dir.$file, ".")); $timeF = filemtime($dir.$file); if (is_file($adr.".gzip.".$ext)) { $timeG = filemtime($adr.".gzip.".$ext); } if ($timeF > $timeG) { // следующая строка покажет файлы которые надо сжимать //print $dir.$file." - GZIP<br>"; // минимизируем (нужен yuicompressor и его реальный адрес) exec("java -jar yuicompressor.jar ".$adr.".".$ext." -o ".$adr.".gzipY.".$ext); // сжимаем if (is_file($adr.".gzipY.".$ext)) { shell_exec("gzip -9 -n -f -c ".$adr.".gzipY.".$ext." > ".$adr.".gzip.".$ext); unlink($adr.".gzipY.".$ext); } else { shell_exec("gzip -9 -n -f -c ".$adr.".".$ext." > ".$adr.".gzip.".$ext); } } } } } } } closedir($dirH); } // Здесь прописываем адрес, где файлы лежат ready("адрес");
В результате получаем сжатые копии всех js и css файлов с именами типа name.gzip.js и name.gzip.css (если нет, то для начала, проверяем правильность адреса и права доступа).
Дальше надо обеспечить отдачу севером актуальной версии файла (без оглядки на кэш). Делается это через добавление к имени файла метки filemtime. На php это реализуется стандартно, например:
<link href="/css/css.v=<?=filemtime($_SERVER['DOCUMENT_ROOT']."css/css.css");?>.css" rel="stylesheet" type="text/css">
Готовая ссылка должна быть такого типа:
<link href="/css/css.v=1263208288.css" rel="stylesheet" type="text/css">
Это уже не раз обсуждалось и подробности можно найти по запросу, например, «разгони свой сайт, практический css/js»…
В файл htaccess добавляем правила переадресации (сразу учитываем и наличие сжатой версии):
RewriteEngine on ReWriteCond %{HTTP:accept-encoding} gzip RewriteRule ^(.*\.)v=[0-9.]+\.(js|css)$ /$1gzip.$2 [QSA,L] ReWriteCond %{HTTP:accept-encoding} !gzip RewriteRule ^(.*\.)v=[0-9.]+\.(js|css)$ /$1$2 [QSA,L] <FilesMatch .*\.gzip\.(js|css)$> Header set Content-Encoding: gzip Header set Cache-control: private </FilesMatch>
Вот и все.
В результате, мы продолжаем комфортно работать с js и css файлами и при этом, всегда имеем их сжатые версии, которые и скармливаются браузеру.