ファイルモニターコンポーネント

背景:

Workermanは常駐メモリで動作し、磁盤の繰り返し読み取りやPHPの再解釈を避けて最高のパフォーマンスを実現することができます。したがって、ビジネスコードを変更した後は、手動でreloadまたはrestartする必要があります。

同時に、Workermanはファイル更新を監視するサービスを提供しており、ファイルの更新を検出すると自動的にreloadを実行し、PHPファイルを再読み込みします。開発者はこれをプロジェクトに配置し、プロジェクトの起動時に実行します。

ファイルモニターサービスのダウンロード先:

  1. 依存なしバージョン: https://github.com/walkor/workerman-filemonitor

  2. inotifyに依存するバージョン: https://github.com/walkor/workerman-filemonitor-inotify (inotify拡張のインストールが必要)

2つのバージョンの違い:

アドレス1のバージョンは、ファイルが更新されたかどうかを判断するためにファイルの更新時間を1秒ごとにポーリングする方法を使用します。

アドレス2はLinuxカーネルの inotify 機構を利用し、ファイルが更新されたときにシステムからWorkermanにアクティブに通知されます。

通常は依存なしバージョンを使用すれば十分です。

使用方法:

Applications/FileMonitorディレクトリをプロジェクトのApplicationsディレクトリにコピーします。

プロジェクトにApplicationsディレクトリがない場合、Applications/FileMonitor/start.phpファイルをプロジェクトの任意の場所にコピーし、起動スクリプトにrequireしてください。

監視コンポーネントはデフォルトでApplicationsディレクトリを監視していますが、変更する必要がある場合はApplications/FileMonitor/start.php内の$monitor_dir変数を変更し、$monitor_dirの値は絶対パスであることをお勧めします。

注意:

  • Windowsシステムではreloadがサポートされておらず、この監視サービスを使用できません。
  • デバッグモードでのみ有効であり、デーモンモードではファイル監視は実行されません(デーモンモードがサポートされていない理由については後述します)。
  • Worker::runAllが実行された後にロードされたファイルのみがホット更新されるため、またはonXXXコールバックでロードされたファイルのみがホット更新されます。

なぜデーモンモードをサポートしていないのか?

デーモンモードは一般的に本番環境で実行されるモードです。本番環境でのリリースバージョンでは、通常複数のファイルが一度にリリースされ、ファイル間に依存関係があることもあります。複数のファイルがディスクに同期されるには時間がかかるため、ある時点でディスク上のファイルが完全ではない状況があります。この時にファイルの更新が検出され、reloadが実行されると、ファイルが見つからないため致命的なエラーが発生するリスクがあります。

また、本番環境では時々オンラインでバグを特定することがあります。コードを直接編集して保存すると、即座に有効になり、構文エラーがあるとオンラインサービスが利用できなくなる可能性があります。正しい方法はコードを保存した後に、php -l yourfile.phpで構文エラーをチェックし、その後にreloadしてコードをホット更新することです。

開発者が本当にデーモンモードでファイル監視と自動更新を有効にする必要がある場合は、Applications/FileMonitor/start.phpのコードを自分で変更し、Worker::$daemonize部分の条件を削除すればよいです。