myvon/reactphp-file-system-watcher

使用 ReactPHP EventLoop 和 ChildProcess 构建的文件系统监视器

1.0 2023-02-12 22:56 UTC

This package is auto-updated.

Last update: 2024-09-15 23:39:42 UTC


README

使用 ReactPHP EventLoop 和 ChildProcess 构建的文件系统监视器。

该软件完全基于 spatie/file-system-watcher 并从 symfony/process 调整为 react/child-process

Latest Version on Packagist Tests Total Downloads

使用 PHP 监视文件系统中的更改

此包允许您响应文件系统中所有类型的更改。

它使用 react/event-loopreact/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

致谢

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件