hyperf2.0以上熱更新解決方案(適用於linux系統)

windawake發表於2020-07-28

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 協議》,轉載必須註明作者和本文連結

相關文章