檔案監控元件
背景:
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 部分的判斷去掉即可。