hyperf官網熱更新加了FinderDriver。它主要是解決linux環境下,本地開發,熱更新沒有比mac系統fswatch好用的問題。但是FinderDriver對mac系統並不友好,mac系統下還是推薦使用fswatch。
配置FindDriver
use Hyperf\Watcher\Driver\ScanFileDriver;
use Hyperf\Watcher\Driver\FswatchDriver;
use Hyperf\Watcher\Driver\FindDriver;
return [
'driver' => FindDriver::class,
'bin' => 'php',
'watch' => [
'dir' => ['app', 'config', 'vendor'],
'file' => ['.env'],
'scan_interval' => 2000,
],
];
hyperf預設熱更新ScanFileDriver掃描vendor目錄下檔案,效能特別低。使用FindDriver的話,掃描效能可以提升上100倍左右。
為什麼FindDriver那麼快
FindDriver熱更新的思路跟ScanFileDriver一樣,每2秒遍歷獲取剛剛更新的檔案然後觸發restart。但是獲取檔案的思路不一樣,FindDriver透過linux系統find命令的高階語法實現,資源消耗小,命令響應快。
find app -mmin -0.05 -type f -printf "%p %T+\n"
find命令在linux系統一般是不用裝擴充套件,使用方便。而且使用上面的命令,在shell上面執行發現,很快就把剛剛更新的檔案顯示出來。
效能對比
工具 | 掃描app目錄耗時(平均值) | 掃描vendor耗時(平均值) | 備註 |
---|---|---|---|
hyperf-watch | 8.136秒 - 重啟時間 | 5.760秒 - 重啟時間 | 奇怪掃描檔案多反而快,但是掃描vendor經常卡得動不了 |
ScanFileDriver | 0.05秒 | 3.8秒 | 掃描檔案越多,效能變慢 |
FindDriver | 0.02秒 | 0.08秒 | 掃描檔案越多,效能平穩 |
ScanFileDriver的掃描檔案邏輯是跟hyperf-watch一樣,所以掃描耗時應該是一樣。但是ScanFileDriver的重啟採用內部機制collector-reload,所以效能快表現在重啟耗時短。FindDriver也是採用內部機制collector-reload。
支援docker
由於FindDriver不支援docker。後面我寫了比FindDriver更快的FindNewDriver,並且支援docker環境。
後記
用ScanFileDriver的時候,感覺很不習慣。然後在回家的路上,突然想到可以用find代替。然後第二天上午就把程式碼寫好了,提交pull request給hyperf官網。感謝hyperf團隊對程式碼重構和加上gfind以支援mac系統。活了這麼久,終於可以為hyperf開源做一點點貢獻。
本作品採用《CC 協議》,轉載必須註明作者和本文連結