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

С背景:

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

В то же время Workerman предоставляет услугу мониторинга обновлений файлов: при обнаружении обновлений файлов услуга автоматически выполняет reload для повторной загрузки 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 в любое место вашего проекта и подключить его в скрипте запуска.

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

注意:

  • Windows система не поддерживает reload, использовать данную службу мониторинга невозможно.
  • Только в режиме debug эта функция работает, в режиме daemon мониторинг файлов не будет выполняться (почему не поддерживается режим daemon, смотрите объяснение ниже).
  • Только файлы, загруженные после выполнения Worker::runAll, могут быть горячо обновлены, или, другими словами, только файлы, загруженные в колбэках onXXX, могут быть горячо обновлены.

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

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

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

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