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 协议》,转载必须注明作者和本文链接
windawake
讨论数量: 4
tangq

机智!哈哈哈

3年前 评论
windawake (楼主) 3年前

这配置写在哪

1年前 评论
windawake (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!