hyperf2.0以上热更新解决方案(适用于linux系统)
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 协议》,转载必须注明作者和本文链接
推荐文章: