# FileMonitor文件監控組件
**背景:**
Workerman是常駐內存運行的,常駐內存可以避免重復讀取磁盤、重復解釋編譯PHP,以便達到最高性能。所以更改業務代碼后需要手動reload或者restart才能生效。
同時workerman提供一個監控文件更新的服務,該服務檢測到有文件更新后會自動運行reload,從新載入PHP文件。開發者將其放入到項目中隨著項目啟動即可。
**文件監控服務下載地址:**
1、無依賴版本:<https://github.com/walkor/workerman-filemonitor>
2、依賴inotify版本:<https://github.com/walkor/workerman-filemonitor-inotify> (需要安裝[inotify擴展](http://php.net/manual/zh/book.inotify.php))
**兩個版本區別:**
地址1版本使用的是每秒輪詢文件更新時間的方法判斷文件是否更新,
地址2利用Linux內核[inotify](http://baike.baidu.com/view/2645027.htm)機制,文件更新時系統會主動通知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部分的判斷去掉即可。
- 序言
- 原理
- 開發必讀
- 入門指引
- 特性
- 簡單的開發示例
- 安裝
- 環境要求
- 下載安裝
- 啟動停止
- 開發流程
- 開發前必讀
- 目錄結構
- 開發規范
- 基本流程
- 通訊協議
- 通訊協議作用
- 定制通訊協議
- 一些例子
- Worker類
- 構造函數
- 屬性
- id
- count
- name
- protocol
- transport
- reusePort
- connections
- stdoutFile
- pidFile
- logFile
- user
- reloadable
- daemonize
- globalEvent
- 回調屬性
- onWorkerStart
- onWorkerReload
- onConnect
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- runAll
- stopAll
- listen
- TcpConnection類
- 屬性
- id
- protocol
- worker
- maxSendBufferSize
- defaultMaxSendBufferSize
- maxPackageSize
- 回調屬性
- onMessage
- onClose
- onBufferFull
- onBufferDrain
- onError
- 接口
- send
- getRemoteIp
- getRemotePort
- close
- destroy
- pauseRecv
- resumeRecv
- pipe
- AsyncTcpConnection類
- 構造函數
- connect
- reconnect
- transport
- Timer定時器類
- add
- del
- 定時器注意事項
- WebServer
- 調試
- 基本調試
- 查看運行狀態
- 網絡抓包
- 跟蹤系統調用
- 常用組件
- GlobalData數據共享組件
- GlobalDataServer
- GlobalDataClient
- Channel分布式通訊組件
- ChannelServer
- channelClient
- 例子-集群推送
- 例子-分組發送
- FileMonitor文件監控組件
- MySQL組件
- workerman/mysql
- swoole/mysql(異步)
- redis組件
- swoole/redis
- 異步http組件
- swoole/http-client
- 異步消息隊列組件
- react/zmq
- react/stomp
- 異步dns組件
- swoole/dns
- 常見問題
- 心跳
- 客戶端鏈接失敗原因
- 是否支持多線程
- 與其它框架整合
- 運行多個workerman
- 支持哪些協議
- 如何設置進程數
- 查看客戶端連接數
- 對象和資源的持久化
- 例子無法工作
- 啟動失敗
- 停止失敗
- 支持多少并發
- 更改代碼不生效
- 向指定客戶端發送數據
- 如何主動推送消息
- 在其它項目中推送
- 如何實現異步任務
- status里send_fail的原因
- Windows下開發Linux下部署
- 是否支持socket.io
- 終端關閉導致workerman關閉
- 與nginx apache的關系
- 禁用函數檢查
- 平滑重啟原理
- 為Flash開843端口
- 如何廣播數據
- 如何建立udp服務
- 監聽ipv6
- 關閉未認證的鏈接
- 傳輸加密-ssl/tsl
- 創建wss服務
- 創建https服務
- workerman作為客戶端
- 作為ws/wss客戶端
- PHP的幾種回調寫法
- 附錄
- Linux內核調優
- 壓力測試
- 安裝擴展
- websocket協議
- ws協議
- text協議
- frame協議
- 不支持的函數/特性
- 版權信息