linux系統下hyperf 熱更新的另一種解決方案

fengchezhi發表於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上面執行發現,很快就把剛剛更新的檔案顯示出來。

後記

用ScanFileDriver的時候,感覺很不習慣。然後在回家的路上,突然想到可以用find代替。然後第二天上午就把程式碼寫好了,提交pull request給hyperf官網。感謝hyperf團隊對程式碼重構和加上gfind以支援mac系統。活了這麼久,終於可以為hyperf開源做一點點貢獻。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章