spatie / file-system-watcher
使用PHP监控文件系统中的更改
Requires
- php: ^8.0
- symfony/process: ^5.2|^6.0|^7.0
Requires (Dev)
- pestphp/pest: ^1.22
- phpunit/phpunit: ^9.5
- spatie/ray: ^1.22
- spatie/temporary-directory: ^2.0
- vimeo/psalm: ^4.3
README
此包允许您对文件系统中的所有更改做出反应。
以下是当新文件被添加时运行代码的示例。
use Spatie\Watcher\Watch; Watch::path($directory) ->onFileCreated(function (string $newFilePath) { // do something... }) ->start();
支持我们
我们投入了大量资源来创建最优秀的开源包。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从家乡给我们寄明信片,注明您正在使用我们的哪个包。您可以在我们的联系页面找到我们的地址。我们将在我们的虚拟明信片墙上发布所有收到的明信片。
安装
您可以通过composer安装此包
composer require spatie/file-system-watcher
在您的项目中,您应该已经安装了JavaScript包chokidar
。您可以通过npm安装它
npm install chokidar
或Yarn
yarn add chokidar
用法
以下是您如何开始监控目录并通知任何更改的示例。
use Spatie\Watcher\Watch; Watch::path($directory) ->onAnyChange(function (string $type, string $path) { if ($type === Watch::EVENT_TYPE_FILE_CREATED) { echo "file {$path} was created"; } }) ->start();
您可以将任意多个目录传递给path
。
要开始监控,请调用start
方法。请注意,start
方法永远不会结束。在那之后的任何代码都不会执行。
为确保监视器在生产中持续监控,请使用类似Supervisord的东西监控启动它的脚本或命令。下面是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 Spatie\Watcher\Watch; Watch::path($directory) ->onFileCreated(function (string $newFilePath) { // do something... });
以下是一些相关可用方法
onFileCreated()
:接受一个闭包,该闭包将传递新文件的路径onFileUpdated()
:接受一个闭包,该闭包将传递更新文件的路径onFileDeleted()
:接受一个闭包,该闭包将传递删除文件的路径onDirectoryCreated()
:接受一个闭包,该闭包将传递创建的目录路径onDirectoryDeleted()
:接受一个闭包,该闭包将传递删除的目录路径
监控多个路径
您可以将多个路径传递给paths
方法。
use Spatie\Watcher\Watch; Watch::paths($directory, $anotherDirectory);
执行多个任务
您可以多次调用onAnyChange
、'onFileCreated'等。所有提供的闭包都将执行
use Spatie\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 Spatie\Watcher\Watch; Watch::path($directory) ->shouldContinue(function () { // return true or false }) // ...
更改监视器速度
默认情况下,更改每0.5秒追踪一次,但您可以更改此设置。
use Spatie\Watcher\Watch; Watch::path($directory) ->setIntervalTime(1000000) //unit is microsecond therefore -> 0.1s // ...rest of your methods
注意:没有进行基于轮询的文件监视。
测试
composer test
Supervisord示例配置
创建一个新的Supervisord配置来监视调用监视器的Laravel artisan命令。在使用Supervisord时,您必须在命令参数中指定您的Node.js和PHP可执行文件:env PATH="/usr/local/bin"
用于Node.js,PHP的绝对路径以及您的项目路径。
[program:watch]
process_name=%(program_name)s
directory=/your/project
command=env PATH="/usr/local/bin" /absolute/path/to/php /your/project/artisan watch-for-files
autostart=true
autorestart=false
user=username
redirect_stderr=true
stdout_logfile=/your/project/storage/logs/watch.log
stopwaitsecs=3600
更新日志
请参阅更新日志获取最近更改的更多信息。
贡献
请参阅贡献指南获取详细信息。
安全漏洞
请查看我们的安全策略了解如何报告安全漏洞。
鸣谢
本包的部分灵感来自Laravel Octane
许可证
MIT许可证(MIT)。请参阅许可证文件获取更多信息。