Компонент мониторинга файлов

Контекст:

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

В то же время Workerman предоставляет сервис мониторинга обновления файлов, который автоматически перезагружает сервер при обнаружении обновлений файлов, чтобы повторно загрузить PHP-файлы. Разработчики должны включить его в проект и он будет запущен вместе с проектом.

Ссылки для загрузки службы мониторинга файлов:

  1. Версия без зависимостей: https://github.com/walkor/workerman-filemonitor
  2. Версия, использующая inotify: https://github.com/walkor/workerman-filemonitor-inotify (требуется установка расширения inotify)

Различия между двумя версиями:

Версия по адресу 1 использует метод опроса времени обновления файлов каждую секунду для определения обновления файлов, в то время как версия по адресу 2 использует механизм inotify ядра Linux, который сообщает workerman об обновлении файлов.

Обычно достаточно использовать первую версию без зависимостей.

Способ использования:

Просто скопируйте каталог Applications/FileMonitor в каталог Applications вашего проекта.

Если в вашем проекте нет каталога Applications, скопируйте файл Applications/FileMonitor/start.php в любое место вашего проекта и выполните require этого файла в запускном скрипте.

По умолчанию компонент мониторинга отслеживает каталог Applications. Если необходимо изменить каталог, можно изменить переменную $monitor_dir в файле Applications/FileMonitor/start.php, значение $monitor_dir рекомендуется указывать как абсолютный путь.

Примечание:

  • Windows не поддерживает перезагрузку, поэтому этот сервис мониторинга недоступен.
  • Сервис мониторинга работает только в режиме отладки, не выполняется в режиме демона (подробнее о неподдерживаемом режиме демона смотрите ниже).
  • Файлы загруженные только после запуска Worker::runAll могут быть обновлены, или же грузятся в колбеках onXXX.

Почему не поддерживается режим демона?

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

Кроме того, при отладке на продакшн сервере иногда изменения кода сохраняются непосредственно, что мгновенно вступает в силу и может привести к невозможности использования онлайн-сервиса из-за синтаксической ошибки. Правильным подходом будет сохранить код, затем проверить его на наличие синтаксических ошибок с помощью php -l yourfile.php и затем выполнить перезагрузку для обновления кода.

Если разработчику действительно нужно включить мониторинг и автоматическое обновление файлов в режиме демона, он может самостоятельно изменить код в файле Applications/FileMonitor/start.php, убрав проверку по Worker::$daemonize.