Skip to content

Added FindNewerDriver which is friendly with mac, linux and docker for watcher.#3170

Merged
limingxinleo merged 4 commits intohyperf:masterfrom
windawake:master
Jan 23, 2021
Merged

Added FindNewerDriver which is friendly with mac, linux and docker for watcher.#3170
limingxinleo merged 4 commits intohyperf:masterfrom
windawake:master

Conversation

@windawake
Copy link
Copy Markdown
Contributor

做了三方面的升级

  1. 使用find %s -newer %s -type f的语法,支持docker,linux和mac等系统。
  2. 通过&符号拼接find的命令行提高find的执行效率。
  3. /tmp创建两个文件,切换更改和扫描的步骤,使查找的文件更加准确,同时删除$fileModifyTimes全局变量,降低内存消耗。

@limingxinleo
Copy link
Copy Markdown
Member

你这基本重写了,重新创建一个 Driver 好了

@windawake
Copy link
Copy Markdown
Contributor Author

我重新创建了新的热更新驱动,命名为NewerFileDriver。之前的修改到FindDriver.php的代码都还原了。

@limingxinleo limingxinleo changed the title 使FindDriver支持docker,linux和mac系统;降低内存消耗,提高热更新性能 Added FindNewerDriver which is friendly with mac, linux and docker for watcher. Jan 23, 2021
@limingxinleo limingxinleo merged commit 0fbda4f into hyperf:master Jan 23, 2021
@jinmarcus
Copy link
Copy Markdown

@windawake
FindNewerDriver 似乎监听不到docker中的宿主文件夹,
使用这种方法创建的docker环境:
docker run --name test -v /d/test:/project -p 9051:9051-it --entrypoint /bin/sh hyperf/hyperf:latest
还有find方法似乎找不到最近被删除的文件。所以删除文件后,应该并不会自动重启。

@limingxinleo
如果有可能,是否使用inotify来监听开发文件的增删改,然后自动热更新,会不会更好一点?

@limingxinleo
Copy link
Copy Markdown
Member

@windawake

FindNewerDriver 似乎监听不到docker中的宿主文件夹,

使用这种方法创建的docker环境:

docker run --name test -v /d/test:/project -p 9051:9051-it --entrypoint /bin/sh hyperf/hyperf:latest

还有find方法似乎找不到最近被删除的文件。所以删除文件后,应该并不会自动重启。

@limingxinleo

如果有可能,是否使用inotify来监听开发文件的增删改,然后自动热更新,会不会更好一点?

可以啊,你帮忙写一个inotify driver吧

@jinmarcus
Copy link
Copy Markdown

@limingxinleo 我是写了,但是我发现似乎监听不到,是不是因为我的开发目录在宿主的目录下?

@windawake
Copy link
Copy Markdown
Contributor Author

windawake commented Jan 26, 2021

@jinmarcus 我按着官网docker下开发教程下载7.4-alpine-v3.11-swoole镜像并且运行,在容器里执行composer require hyperf/watcher --dev dev-master,然后按着教程发布配置,使用上FindNewerDriver,尝试修改app目录下的文件可以看到重启进程的热更新效果

我本地试了一下,hyperf/hyperf:latest的镜像里使用php7.2.33版本,无法加载hyperf2.1框架

@windawake
Copy link
Copy Markdown
Contributor Author

@limingxinleo 我是写了,但是我发现似乎监听不到,是不是因为我的开发目录在宿主的目录下?

@jinmarcus inotifyDriver开发起来有难度,首先php要安装inotify扩展。个人感觉可以尝试利用ls -tRlinux内置的命令做开发,查询出来的结果md5并且保存起来,跟上一次的md5结果做比较,如果不相等就要热更新,这样可以实现删除文件时热更新。就不知道性能,兼容性和可用性怎么样。

@jinmarcus
Copy link
Copy Markdown

jinmarcus commented Jan 27, 2021

@windawake 我现在主要遇到的问题就是,我在windows下的docker开发,docker的开发目录使用的是宿主目录,就是映射出来的windows目录,

就是使用下面这条命令创建的环境
docker run --name test -v /d/test:/project -p 9051:9051-it --entrypoint /bin/sh hyperf/hyperf:latest
这条命令意思就是将d盘下的test目录映射到docker中的project目录,但是用find和inotify,都无法很准确的监控到文件的变化。

而官方提供的ScanFileDriver 就是很粗暴的每隔2秒把所有被监控的文件全部读取并判断md5是否有更新,然后热更新,这倒是能解决这个问题,就是感觉效率并不高。修改了文件后,往往需要2-3秒后才有反应,然后全部热更新的时间,有时候会达到7-8秒甚至更长时间,监控的文件越多,等待的时间就越长。

@windawake
Copy link
Copy Markdown
Contributor Author

windawake commented Jan 30, 2021

@jinmarcus 今天我家里的i5-9400F+24G的台式电脑安装了Windows 10 20H2专业版系统,执行docker run --name hyperf -v D:\code\hyperf:/project -p 9501:9501 -it --privileged -u root --entrypoint /bin/sh hyperf/hyperf:7.4-alpine-v3.11-swoole,安装最新的watcher并且启动hyperf,使用FindNewerDriver配置监控vendor目录。

use Hyperf\Watcher\Driver\FindNewerDriver;

return [
    'driver' => FindNewerDriver::class,
    'bin' => 'php',
    'watch' => [
        'dir' => ['app', 'config', 'vendor'],
        'file' => ['.env'],
        'scan_interval' => 2000,
    ],
];

自测的结果是大部分都能实现热更新,很少会出现热更新失败。如果热更新失败的话,可以采用多次按ctrl+s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants