Как эффективно отслеживать каталог на наличие изменений в Linux? - PullRequest
7 голосов
/ 22 июля 2011

Я работаю с Magento, и есть функция, которая объединяет CSS и Javascript в один большой файл.

Независимо от плюсов и минусов, существует следующая проблема:

Окончательный файл кэшируется на нескольких уровнях, которые включают, но не ограничиваются:

  • Amazon CloudFront
  • Прокси-серверы
  • Кэш браузера клиента

Magento использует сумму MD5 объединенных имен файлов CSS для создания нового имени файла для объединенного файла CSS. Так что каждая страница, имеющая отдельный набор CSS-файлов, получает правильный объединенный CSS-файл.

Чтобы обойти проблему кэширования, я также включил временные метки изменения файла в этот хэш, чтобы каждый раз создавался новый хэш, каждый раз при изменении файла css.

Таким образом, все преимущества нереаливационной оценки кэширования, но если что-то меняется, это видно сразу, потому что ссылка на ресурс изменилась.

Пока все хорошо:

Единственная проблема в том, что имена файлов, которые используются для генерации хэдов, являются только теми, на которые обычно бы напрямую ссылались в блоке HTML-Head, а не include css импорт внутри этих файлов .

Таким образом, изменения в файлах, которые импортируются внутри CSS-файлов, не приводят к новому хешу.

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

Я скорее думал о решении на основе каталогов. Есть ли что-нибудь, чтобы эффективно отслеживать «последнее изменение внутри каталога» в файловой системе?

Мы используем ext4.

Или, может быть, есть другой способ, может быть, с помощью команды find, который выполняет всю работу на основе индексов inode?

Что-то подобное?

Я видел много программ, которые мгновенно «видят» изменения, не сканируя целые файловые системы. Я полагаю, что в Linux также есть демоны наблюдения за манипуляциями с файлами.

Проблема в том, что каталог css довольно большой.

Кто-нибудь может указать мне правильное направление?

Ответы [ 4 ]

6 голосов
/ 22 июля 2011

Я предлагаю вам использовать php-независимый демон для изменения даты изменения вашего основного css-файла при изменении одного из зависимых php-файлов.Вы можете использовать для этого dnotify, что-то вроде:

dnotify -a -r -b -s /path/to/imported/css/files/ -e touch /path/to/main/css/file;

Он будет выполнять «прикосновение» к основному CSS-файлу каждый раз, когда один из файлов в другой папке изменяется (-a -r -b -s =любой доступ / рекурсивный поиск в каталоге / запуск в фоновом режиме / без вывода).Или вы можете выполнить любое другое действие и проверить его с помощью PHP.

2 голосов
/ 22 июля 2011

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

2 голосов
/ 22 июля 2011

Если вы используете команду

ls -ltr `find . -type f `

Это даст вам длинный список всех файлов с самыми новыми в нижней части.

1 голос
/ 22 июля 2011

Я никогда не использовал его, но, очевидно, есть поддержка inotify для PHP .

(inotify был бы наиболее эффективным способом получения уведомлений под Linux)

...