myvon / reactphp-file-system-watcher
使用 ReactPHP EventLoop 和 ChildProcess 构建的文件系统监视器
Requires
- react/child-process: ^0.6.5
Requires (Dev)
- pestphp/pest: ^1.22
- spatie/temporary-directory: ^2.1
README
使用 ReactPHP EventLoop 和 ChildProcess 构建的文件系统监视器。
该软件完全基于 spatie/file-system-watcher 并从 symfony/process 调整为 react/child-process
使用 PHP 监视文件系统中的更改
此包允许您响应文件系统中所有类型的更改。
它使用 react/event-loop 和 react/child-process 来运行,而不会阻塞您的其他代码(有关更多信息,请参阅 ReactPHP)。
当添加新文件时运行代码。
use Myvon\Watcher\Watch; Watch::path($directory) ->onFileCreated(function (string $newFilePath) { // do something... }) ->start();
安装
您可以通过 composer 安装此包
composer require myvon/reactphp-file-system-watcher
在您的项目中,您应该安装 JavaScript 包 chokidar
。您可以通过 npm 安装它
npm install chokidar
或 Yarn
yarn add chokidar
使用
以下是如何开始监视目录并接收任何更改的通知。
use Myvon\Watcher\Watch; $watcher = Watch::path($directory) ->onAnyChange(function (string $type, string $path) { if ($type === Watch::EVENT_TYPE_FILE_CREATED) { echo "file {$path} was created"; } }) ->start();
您可以将任意多的目录传递给 path
。
要开始监视,请调用 start
方法。
为了确保监视器在生产中继续监视,请使用类似 Supervisord 的工具监视启动监视器的脚本或命令。
检测更改类型
您传递给 onAnyChange
的闭包的 $type
参数可以包含以下值之一
Watcher::EVENT_TYPE_FILE_CREATED
:创建了一个文件Watcher::EVENT_TYPE_FILE_UPDATED
:更新了一个文件Watcher::EVENT_TYPE_FILE_DELETED
:删除了一个文件Watcher::EVENT_TYPE_DIRECTORY_CREATED
:创建了一个目录Watcher::EVENT_TYPE_DIRECTORY_DELETED
:删除了一个目录
监听特定事件
要处理特定类型的文件系统事件,您可以使用专用函数。以下是如何仅监听文件创建的示例。
use Myvon\Watcher\Watch; Watch::path($directory) ->onFileCreated(function (string $newFilePath) { // do something... });
以下是一些相关可用方法
onFileCreated()
:接受一个闭包,该闭包将传递新的文件路径onFileUpdated()
:接受一个闭包,该闭包将传递更新的文件路径onFileDeleted()
:接受一个闭包,该闭包将传递删除的文件路径onDirectoryCreated()
:接受一个闭包,该闭包将传递创建的目录路径onDirectoryDeleted()
:接受一个闭包,该闭包将传递删除的目录路径onClose()
:接受一个闭包,当监视器停止时将被调用
监视多个路径
您可以将多个路径传递给 paths
方法。
use Myvon\Watcher\Watch; Watch::paths($directory, $anotherDirectory);
执行多个任务
您可以多次调用 onAnyChange
、'onFileCreated'、... 所有给定的闭包都将执行
use Myvon\Watcher\Watch; Watch::path($directory) ->onFileCreated(function (string $newFilePath) { // do something on file creation... }) ->onFileCreated(function (string $newFilePath) { // do something else on file creation... }) ->onAnyChange(function (string $type, string $path) { // do something... }) ->onAnyChange(function (string $type, string $path) { // do something else... }) // ...
优雅地停止监视器
默认情况下,监视器启动后将继续无限期运行。有两种方法可以优雅地停止监视器
- 您可以调用
shouldContinue
并传递一个闭包。如果闭包返回一个假值,监视器将停止。指定的闭包将每0.5秒执行一次。
use Myvon\Watcher\Watch; Watch::path($directory) ->shouldContinue(function () { // return true or false }) // ...
- 您可以在代码的任何地方调用
stop
方法。
use Myvon\Watcher\Watch; $watcher = Watch::path($directory); // ... $watcher->stop();
更改监视器的速度。
默认情况下,更改每0.5秒跟踪一次,但您可以更改这一点。
use Myvon\Watcher\Watch; Watch::path($directory) ->setIntervalTime(0.1) //unit is seconds therefore -> 0.1s // ...rest of your methods
您也可以在 start
中直接指定间隔。
use Myvon\Watcher\Watch; Watch::path($directory) ->start(null, 0.1); //unit is seconds therefore -> 0.1s // ...rest of your methods
使用另一个循环。
默认情况下,监视器将通过调用 Loop:get()
使用默认循环。如果需要,您可以通过将其作为 start
的第一个参数传递来使用实现 LoopInterface
接口的另一个循环。
use Myvon\Watcher\Watch; $loop = new MyCustomLoop(); Watch::path($directory) ->start($loop);
注意:监视器将注册所需的定时器,但不会启动循环,别忘了启动它。
您还可以查看 test/WatchTest.php
以了解如何通过测试使用一个循环。
测试
composer test
贡献
有关详细信息,请参阅 CONTRIBUTING。
致谢
- 所有致谢归功于 Spatie 和原始的 spatie/file-system-watcher 库。
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件。