ファイル監視コンポーネント
背景:
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のバージョンは、毎秒ファイルの更新時間をポーリングしてファイルの更新を判断する方法を使用しています。
アドレス2はLinuxカーネルのinotifyメカニズムを利用しており、ファイルが更新されるとシステムがWorkermanに対して通知します。
一般的には、最初の依存なしバージョンを使用することができます。
使用方法
Applications/FileMonitorディレクトリをプロジェクトのApplicationsディレクトリにコピーすれば完了です。
もしプロジェクトにApplicationsディレクトリがない場合は、Applications/FileMonitor/start.phpファイルをプロジェクト内の任意の場所にコピーして、起動スクリプトでrequireすればよいです。
監視コンポーネントはデフォルトでApplicationsディレクトリを監視しますが、変更が必要な場合はApplications/FileMonitor/start.php内の$monitor_dir変数を修正してください。$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部分の判断を削除すればよいです。