LINUX.ORG.RU

Сжатие CSS по шаблону и крону

 , , , ,


1

1

Доброго времени суток.

Исходные данные: VPS на Centos 6. Nginx + php-fpm. Цель: отдача заранее сжатых CSS файлов в формате gz. Периодическое обновление, т.к. установлена CMS и при обновлениях файлы css в архивах будут уже не актуальными. Способы решения: запуск крон по расписания в определенных папках, сжимать только css файлы (возможно JS), сжатый файл размещать в той же папке. Обновлять файл по расписанию, заменяя старый.

Проблема: не знаю как настроить :)

Прошу помощи специалистов, либо посыл в нужном направлении на нужную литературу.

Спасибо.

Что за cms? А разве веб-сервер не gzipит response?

Shadow ★★★★★ ()
Ответ на: комментарий от Shadow

Что за cms?

Прозреваю wordpress.

А разве веб-сервер не gzipит response?

Nginx умеет, но видимо ТСу не нравится что он заново сжимает файлы при каждом запросе, хочется сжать их один раз. Nginx, по идее, умеет использовать заранее сжатые файлы. Не уверен что выигрыш значим (кажется я замерял, но это было давно и неправда).

MrClon ★★★★★ ()
Ответ на: комментарий от MrClon

Joomla, но к задаче это отношения не имеет, важно лишь то, что файлы css разбросаны по разным папкам (модули, компоненты, шаблоны) и периодически обновляются. Nginx умеет отдавать заранее сжатые файлы, сжатие онлайн он так же умеет - но это нагрузка на проц.

foxer666 ()
Ответ на: комментарий от foxer666

А ты измерь сколько той нагрузки, может игра не стоит свеч.
По стеме тебе уже всё сказали. man find; man gzip; man cron

MrClon ★★★★★ ()
Ответ на: комментарий от foxer666

Для жумлы есть «умные» плагины. Поищи.

anonymous ()
Ответ на: комментарий от MrClon

Мануалы почитаны, но увы реализация пока не реализована :(

Спасибо.

foxer666 ()
Ответ на: комментарий от foxer666

find /some/dir -type f -name '*.css' -exec gzip '{}' \;
Как-то так.

MrClon ★★★★★ ()

Такие вещи делают заранее, это называется сборка фронтенда
А уже сам nginx сжимает на ходу в gzip и сохраняет в кеш

mystery ★★ ()
Ответ на: комментарий от MrClon

Спасибо за ответ, все работает, вложенные папки так же сканирует, единственная фича gzip - удаление сжатых файлов, параметр -c не работает почему-то.

foxer666 ()
Ответ на: комментарий от foxer666

В смысле удаление исходного, не сжатого, файла после сжатия? Нафига? Или ты ещё и место на диске экономить решил так?

MrClon ★★★★★ ()
Ответ на: комментарий от MrClon

Я же говорю, это фича gzipa, он по умолчанию сам удаляет исходник :) В маунале указано использовать -c параметр, но у меня он не работает и исходник удаляет.

foxer666 ()
Ответ на: комментарий от foxer666

указано использовать -c параметр, но у меня он не работает

gzip < file > file.gz

А вообще, тут вместо крона больше подошёл бы incron

zolden ★★★★★ ()
for X in `find /path/to/css -name "*.css"; do
   if [ ! -w "$X.gz" -o "$X" -nt "$X.gz" ]; then
      gzip -cfq9 "$X" > "$X.gz";
   fi;
done;
i36_zubov ()

+1 к incron

но вообще это костыли, неужели cms сама не умеет собирать все css файлы в один и сжимать их ?

TDrive ★★★★★ ()
Последнее исправление: TDrive (всего исправлений: 1)

Зачем весь этот бред? Напиши скрипт (на чем там твой проект), который будет все собирать, проверять и отдавать что нужно, и подключи его вместо всех своих CSS/JS файлов.

znenyegvkby ()
Последнее исправление: znenyegvkby (всего исправлений: 1)

Решение - плохое. Для таких вещей, как минимум, есть incrontab.

alexmaru ()
Последнее исправление: alexmaru (всего исправлений: 1)
Ответ на: комментарий от znenyegvkby

и подключи его вместо всех своих CSS/JS файлов

а вот дёргать .php ради погрузки статики - вот это реально бред.

alexmaru ()
Ответ на: комментарий от alexmaru

а вот дёргать .php ради погрузки статики - вот это реально бред.

Ага? И кто тебе это нашептал?

znenyegvkby ()

Makefile:

CSS = $(wildcard *.css)
build:
  @cat $(CSS) > styles.css
  @gzip < styles.css > styles.css.gz

Это в папку со стилями
Про wildcard можешь в мане Make почитать
В кроне делаешь на нужный период make -c <dir_contains_makefile> и все
Если systemd, то воспользуйся systemd.timer

mystery ★★ ()
Ответ на: комментарий от znenyegvkby

Ага? И кто тебе это нашептал?

я сам себе это нашептал. Особенной болью было наблюдать, как некоторые используют всякие библиотеки типа phpthumb, а потом апочемууменятормозит?пхпговно! Тем более, что такие чудеса не проходят гугло-спид-тест.

В общем, чем тебе не угодила обычная генерация сжатых файлов при изменении? Так и кеш браузера обходится (файл с новым названием, когда надо). Разные css к разным страницам? Так собственно, собираться они так и должны - под разные типы страниц по копии.

Точно так же с сжатыми изображениями - нельзя ж генерировать на ходу, это дикость.

alexmaru ()
Последнее исправление: alexmaru (всего исправлений: 1)

Ребят, всем спасибо за ответы и советы. Вопрос можно сказать решен и выбор был сделан. Удачного кодинга :)

foxer666 ()
Ответ на: комментарий от alexmaru

Точно так же с сжатыми изображениями - нельзя ж генерировать на ходу, это дикость.

Отдельная тема.

В общем, чем тебе не угодила обычная генерация сжатых файлов при изменении?

Минимизацию ты каждый раз перед сжатием проводишь? Все файл в один тоже каждый раз сам ручками собираешь? Сжатие (только по необходимости, а не каждый раз) как осуществляешь?

Особенной болью было наблюдать, как некоторые используют всякие библиотеки типа phpthumb, а потом апочемууменятормозит?пхпговно!

Не слышал про phpthumb, но на всех проектах юзали такой метод и _никогда ЭТО_ проблемой не было. Может вы что-то делаете не так.

я сам себе это нашептал.

Ну тогда яснопонятно, можно было и не объяснять.

znenyegvkby ()
Ответ на: комментарий от znenyegvkby

Минимизацию ты каждый раз перед сжатием проводишь? Все файл в один тоже каждый раз сам ручками собираешь? Сжатие (только по необходимости, а не каждый раз) как осуществляешь?

Не я, аналог incron у меня это делает. То есть, меняется, допустим, .js - оно отправляется на компиляцию, а потом сбрасывает кеши на сайте. Очень удобно. Так же с css, less, и чисткой изображений от недосжатия.

Точно так же действует модуль от гугла для nginx, pagespeed, но он каждый раз анализирует html, которые он отдаёт (если они с персональным хедером), и собственно - сам начинает дико тормозить, его можно только на пре-генерированные страницы натравливать.

Не слышал про phpthumb, но на всех проектах юзали такой метод и _никогда ЭТО_ проблемой не было. Может вы что-то делаете не так.

Ну да, побольше ресурсов, пожирнее память. Приближай тепловую смерть. Серьёзно, почему не используете сам nginx, который просто проверяет есть-ли пересжатый файл в папке/CDN, и только если его нет - отправлять в обработку?

Ну, например, что-то типа img/name_size_X_Y.jpg

При обработке файл сохраняется, и больше PHP никогда не трогается. Плюс, на реально нормальную обработку можно потратить больше времени в фоне, и не торопясь разместить файл. В среднем, 30% от веса медиа-файлов сразу, и счастливая рожа гугла обеспечена.

В phpthumb, когда я его последний раз видел, подход был такой: он делает ресайз на ходу, и записывает на диск файл. Если файл есть (он это каждый раз проверяет), он делает редирект на этот файл. Это реально убого, потому что кроме первого раза, вхолостую поднимаются лишние php, и в целом - сайт отдаётся медленнее, в зависимости от количества ресурсов.

alexmaru ()
Ответ на: комментарий от alexmaru

Серьёзно, почему не используете сам nginx

А откуда ты взял, что не используем? :) И кэш и сжатие nginx работает с подготовленным на бэкенде файлом. Просто в эту подготовку входит не только минимизация/сборка/etc, но и специфичные алгоритмы динамической сборки. Там множество нюансов на самом деле, и смысл простой – от предварительной сборки перед отдачей nginx'у не отказаться.

Ну, например, что-то типа img/name_size_X_Y.jpg

Ну про графику я уже говорил, у нас это совсем отдельный разговор.

znenyegvkby ()
Ответ на: комментарий от alexmaru

в зависимости от количества ресурсов.

В каком смысле? Говорю же, не знаю что такое phpthumb. Он каждый media-css-js файл отдельно сжимает что-ли и проверяет на кэш?

znenyegvkby ()
Ответ на: комментарий от znenyegvkby

не, это старая поделка, которую прикручивали везде лет 5 назад, для уменьшения картинок на лету. К CSS отношения не имеет. Суть его была в том, что каждый раз дёргался php.

насчёт css/js - я у себя динамическую сборку сделал методом анализа всех темплейтов/подключаемых модулей, то есть, все варианты генерируются сразу (то есть, остаётся только полезный код для каждой страницы).

твоё возмущение вначале, как мне показалось, было в защиту «постоянно дёргать php, не создавая файлы». Вот я возмутился по-полной.

короче, всё ясно :-)

alexmaru ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.