Как можно отследить изменение файлов в директории?
Хочу реализовать вотчер, который будет следить за изменением файлов в директории и кидать соответствующее событие. Единственный подход, который пришел в голову: это крутить консольный скрипт в бесконечном цикле с заданным интервалом, например, 10 сек и сверять слепок папки со слепком из предыдущей итерации, но подход кажется мне не очень удачным в плане нагрузки на фс. Есть ли более удачное решение?
Как вариант - сортировать файлы по времени изменения desc. И смотреть на самый первый. Если изменился - значит брать детальные изменения. Но тут суть схожа с вашей идеей.
Если файлы таки меняются посредством http запросов, то просто делаешь класс слушателя и в нужных API методах дергаешь событие. Для Laravel https://laravel.com/docs/11.x/events, если на чистом PHP, то вызываешь в API метод который положит, нужные для обработки изменений, данные в очередь (например на редисе) и рядом делаешь демон, который из очереди будет вычитывать и что-то с этим делать
Мне решение нужно на php, суть в следующем. У меня есть микрофремворк, на котором пилю пет проекты. Роутинг приложения, регистрация консольных команд, пайплайна построена на php атрибутах и сейчас, например, при создании контроллера мне приходиться каждый раз запускать консольный скрипт, который сканирует папку с проектом и регистрирует изменения. Хочу автоматизировать этот процесс, прикрутив вотчер, который будет дергать команду для конкретного файла в проекте.
Я вешаю на него атрибут Route, после чего консольной командой сканирую директорию проекта, нахожу все классы с нужным атрибутом и регистрирую их в роутер, потом маршруты кешируются в конфигурационном файле.
Например как это делает спираль роутер
это не обязательно делать в php, shell достаточно
для периодического запуска какого то процесса можно использовать команду watch, которая будет запускать какой то процесс с заданной периодичностью или постоянно и выводить обновление при изменении вывода... https://linux.die.net/man/1/watch
Например watch -d ls -l будет постоянно считывать содержимое текущей папки и обновлять вывод только при её изменении (новые файлы или удаление старых).
С изменением каких то существующий файлов немного иначе, тут надо очевидно попробовать запускать через эту команду tail, который будет следить за содержимым конкретного файла. Я не пробовал, стоит провести эксперимент.