文件監控組件
背景:
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 利用 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,則會有找不到文件導致致命錯誤的風險。
另外正式環境中有時候會在線定位 bug,如果直接編輯代碼保存,就會立刻生效,有可能出現語法錯誤導致線上服務不可用。正確的方法應該是保存代碼後,通過 php -l yourfile.php 檢查下是否有語法錯誤,然後再 reload 熱更新代碼。
如果開發者確實需要 daemon 模式開啟文件監控及自動更新,可以自行更改 Applications/FileMonitor/start.php 代碼,將 Worker::$daemonize 部分的判斷去掉即可。