Самый быстрый способ сравнить состояние каталога или хеширование для удовольствия и прибыли

У нас есть приложение PHP, и они думали, что было бы полезно узнать, было ли приложение известно, произошли ли изменения в его составе после последнего выполнения. В основном из-за управления кэшами и т. Д., И зная, что к нашим приложениям иногда обращаются люди, которые не помнят очистить кеш от изменений. (Изменение людей – это очевидный ответ, но, увы, не реально достижимый)

Мы придумали это, что является самым быстрым, что нам удалось ускорить, и на среднем уровне 0,08 на машине разработчика для типичного проекта. Мы экспериментировали с shasum, md5 и crc32, и это самый быстрый. Мы в основном собираем содержимое каждого файла, а md5 – вывод. Безопасность не вызывает беспокойства, нас просто интересует обнаружение изменений файловой системы с помощью различной контрольной суммы.

time (find application/ -path '*/.svn' -prune -o -type f -print0 | xargs -0 md5 | md5) 

Я полагаю, вопрос в том, может ли это быть оптимизировано дальше?

(Я понимаю, что обрезка svn будет стоить, но находка занимает наименьшее количество времени из компонентов, поэтому она будет довольно минимальной. Мы тестируем это на рабочей копии atm)

Related of "Самый быстрый способ сравнить состояние каталога или хеширование для удовольствия и прибыли"

Вы можете получать уведомления об изменениях файловой системы, используя расширение inotify .

Он может быть установлен с помощью:

 pecl install inotify 

Или вручную (скачать, phpize && ./configure && make && make install, как обычно).

Это необработанное привязку к системным вызовам linux inotify и, вероятно, является самым быстрым решением для Linux.

См. Этот пример простой реализации tail : http://svn.php.net/viewvc/pecl/inotify/trunk/tail.php?revision=262896&view=markup


Если вы хотите, чтобы библиотека более высокого уровня, или suppot для не-linux-систем, взгляните на Lurker .

Он работает в любой системе и может использовать inotity, когда он доступен.

См. Пример из README :

 $watcher = new ResourceWatcher; $watcher->track('an arbitrary id', '/path/to/views'); $watcher->addListener('an arbitrary id', function (FilesystemEvent $event) { echo $event->getResource() . 'was' . $event->getTypeString(); }); $watcher->start(); 

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

 find . -name '.svn' -prune -o -type f -printf '%m%c%p' | md5sum 

Это намного быстрее, чем чтение и хэширование содержимого каждого файла.

Мы не хотели использовать FAM, так как нам нужно будет установить его на сервер, и это не всегда возможно. Иногда клиенты настаивают на развертывании на их сломанной инфраструктуре. Так как это прекращено, его трудно получить, что изменение также одобрило волокиту.

Единственный способ улучшить скорость исходной версии в этом вопросе – убедиться, что список файлов максимально кратким. IE только хеш каталоги / файлы, которые действительно имеют значение, если они изменены. Вырезание каталогов, которые не имеют значения, может дать большие ускорения скорости.

В прошлом это приложение использовало эту функцию, чтобы проверить, были ли какие-либо изменения, чтобы очистить кеш, если они были. Поскольку мы не хотим останавливать приложение во время его выполнения, такого рода вещи лучше всего обрабатывать тщательно как асинхронный процесс с использованием fsockopen. Это дает лучшее «ускорение скорости» в целом, просто будьте осторожны с условиями гонки.

Отмечая это как «ответ» и отвечающий за ответ FAM.

Вместо того, чтобы активно искать изменения, почему бы не получить уведомление, когда что-то изменится. Взгляните на API FAM – File Alteration Monitor для PHP

FAM контролирует файлы и каталоги, уведомляя о заинтересованном применении изменений. Более подробную информацию о FAM можно получить по адресу http://oss.sgi.com/projects/fam/ . Сценарий PHP может указывать список файлов для FAM для мониторинга с использованием функций, предоставляемых этим расширением. Процесс FAM запускается при открытии первого подключения из любого приложения к нему. Он выходит после того, как все соединения с ним были закрыты.

CAVEAT: требуется дополнительный демон на машине, а расширение PECL не поддерживается.

так как у вас есть svn, почему бы вам не пойти на исправления. я понимаю, что вы пропускаете svn-папки, но я полагаю, что вы сделали это для удобства скорости и что у вас нет модифицированных файлов на ваших производственных серверах …

что, как сказано, вам не нужно изобретать колесо.

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

вы также можете остановиться, как только заметите разницу (теоретически сократите время наполовину в среднем) и т. д. есть много.

я честно считаю, что лучший способ в этом случае – просто использовать уже имеющиеся инструменты.

в отличие от linux tool diff есть опция -q (быстрая).

вам нужно будет использовать его с рекурсивным параметром -r .

diff -r -q dir1/ dir2/

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