文件監(jiān)控組件
背景:
Workerman是常駐內(nèi)存運(yùn)行的,常駐內(nèi)存可以避免重復(fù)讀取磁盤(pán)、重復(fù)解釋編譯PHP,以便達(dá)到最高性能。所以更改業(yè)務(wù)代碼后需要手動(dòng)reload或者restart才能生效。
同時(shí)workerman提供一個(gè)監(jiān)控文件更新的服務(wù),該服務(wù)檢測(cè)到有文件更新后會(huì)自動(dòng)運(yùn)行reload,從新載入PHP文件。開(kāi)發(fā)者將其放入到項(xiàng)目中隨著項(xiàng)目啟動(dòng)即可。
文件監(jiān)控服務(wù)下載地址:
1、無(wú)依賴版本:https://github.com/walkor/workerman-filemonitor
2、依賴inotify版本:https://github.com/walkor/workerman-filemonitor-inotify (需要安裝inotify擴(kuò)展)
兩個(gè)版本區(qū)別:
地址1版本使用的是每秒輪詢文件更新時(shí)間的方法判斷文件是否更新,
地址2利用Linux內(nèi)核inotify機(jī)制,文件更新時(shí)系統(tǒng)會(huì)主動(dòng)通知workerman。
一般使用第一個(gè)無(wú)依賴版本即可
使用方法
將Applications/FileMonitor目錄拷貝到你項(xiàng)目的Applications目錄下即可。
如果你的項(xiàng)目沒(méi)有Applications目錄,可以將Applications/FileMonitor/start.php文件拷貝到你的項(xiàng)目任意位置,在啟動(dòng)腳本中require到啟動(dòng)腳本中即可。
監(jiān)控組件默認(rèn)監(jiān)控的是Applications目錄,如果需要更改,可以修改Applications/FileMonitor/start.php中的$monitor_dir
變量,$monitor_dir
的值建議是絕對(duì)路徑。
注意:
- windows系統(tǒng)不支持reload,無(wú)法使用此監(jiān)控服務(wù)。
- 只有在debug模式下才生效,daemon下不會(huì)執(zhí)行文件監(jiān)控(為何不支持daemon模式見(jiàn)下面說(shuō)明)。
- 只有在Worker::runAll運(yùn)行后加載的文件才能熱更新,或者說(shuō)只有在onXXX回調(diào)中加載的文件才能熱更新。
為何不支持daemon模式?
daemon模式一般為線上正式環(huán)境運(yùn)行的模式。正式環(huán)境發(fā)布版本時(shí),一般一次發(fā)布多個(gè)文件,文件之間也可能有依賴。由于多個(gè)文件同步到磁盤(pán)需要一定時(shí)間,會(huì)存在某個(gè)時(shí)刻磁盤(pán)上的文件不全的情況,如果這時(shí)候監(jiān)控到了文件更新并執(zhí)行了reload,則會(huì)有找不到文件導(dǎo)致致命錯(cuò)誤的風(fēng)險(xiǎn)。
另外正式環(huán)境中有時(shí)候會(huì)在線定位bug,如果直接編輯代碼保存,就會(huì)立刻生效,有可能出現(xiàn)語(yǔ)法錯(cuò)誤導(dǎo)致線上服務(wù)不可用。正確的方法應(yīng)該是保存代碼后,通過(guò)php -l yourfile.php
檢查下是否有語(yǔ)法錯(cuò)誤,然后再reload熱更新代碼。
如果開(kāi)發(fā)者確實(shí)需要daemon模式開(kāi)啟文件監(jiān)控及自動(dòng)更新,可以自行更改Applications/FileMonitor/start.php代碼,將Worker::$daemonize部分的判斷去掉即可。