studio24 / rotate
文件旋转工具,可旋转并删除旧文件
Requires
- php: >=5.6.0
Requires (Dev)
- phpunit/phpunit: ^5.2
This package is auto-updated.
Last update: 2024-09-08 06:21:14 UTC
README
简单的文件旋转工具,可以旋转并删除旧文件或文件夹,在不能使用logrotate(例如Windows系统)或基于文件名中的时间戳或日期旋转或删除文件时非常有用。
安装
composer require studio24/rotate
使用方法
您可以使用Rotate在两种模式下使用:旋转(重命名文件并删除最旧的文件)或删除(根据模式删除文件)。
在PHP脚本顶部导入
use studio24\Rotate\Rotate;
设置文件名格式以匹配
Rotate和Delete都通过构造函数或通过setFilenameFormat()
方法传入您想要匹配的文件名模式。这可以用于匹配单个文件、符合模式的文件或文件名模式中的日期时间。
仅对文件操作
匹配叶元素
请注意,文件匹配是在最后一个叶元素上进行的。扫描父文件夹中的所有文件,检查(对于删除而言是文件夹)是否符合指定的模式。
例如,传递path/to/*.log
将在path/to
文件夹中搜索所有以.log结尾的文件。
文件名模式
匹配文件或文件夹时支持以下模式
debug.log
- 与名为debug.log的文件完全匹配*
- 匹配任何字符串,例如*.log
匹配所有以.log结尾的文件{Ymd}
- 匹配文件中的时间段,例如order.{Ymd}.log
匹配格式为order.20160401.log的文件
日期时间格式
对于日期时间格式,允许使用由DateTime::createFromFormat支持的任何日期格式,不包括时区标识符e
、空白和分隔符字符。
递归删除文件夹
您还可以删除文件夹及其所有匹配的子文件。但是,这很危险,因此默认情况下不能删除文件夹。您需要显式添加安全删除的文件夹路径,通过Delete::addSafeRecursiveDeletePath($path)
。在调用此函数时,您需要使用完整的绝对路径。如果需要,请使用realpath()
展开完整路径。
例如,如果您想删除/var/www/test/staging/data/logs/
中的所有1+个月前的文件夹
$rotate = new Delete('/var/www/test/staging/data/logs/old-logs/*');
$rotate->addSafeRecursiveDeletePath('/var/www/test/staging/data/logs/');
$files = $rotate->deleteByFilenameTime('1 month');
上面的代码将允许您删除/var/www/test/staging/data/logs/
中的文件夹。
旋转
类似于logrotate旋转日志文件。
以下示例旋转文件debug.log,将debug.log重命名为debug.log.1,debug.log.1重命名为debug.log.2,以此类推。它保留10个副本,因此删除debug.log.10并将debug.log.9重命名为debug.log.10。
use studio24\Rotate\Rotate; $rotate = new Rotate('path/to/debug.log'); $rotate->run();
保留副本的数量
Rotate默认保留10个文件副本,您可以通过以下方式更改此设置
$rotate->keep(20);
基于文件大小旋转
您只能在文件达到一定大小时旋转文件,而不是在每次运行$rotate->run()
方法时自动旋转。
$rotate->size("12MB");
删除
根据修改时间、文件名中的日期时间或自定义回调函数删除文件。
基于时间
根据修改时间删除文件。例如,删除一个文件夹中超过3个月的JPG文件。
use studio24\Rotate\Delete; $rotate = new Delete('path/to/images/*.jpg'); $deletedFiles = $rotate->deleteByFileModifiedDate('3 months');
deleteByFileModifiedDate()
方法接受有效的 DateInterval 对象或相对日期格式,具体请参考 相对格式。
文件名中的时间格式
根据文件名中的日期时间删除文件。例如,删除所有文件名中日期超过 3 个月的订单日志文件
use studio24\Rotate\Delete; $rotate = new Delete('path/to/logs/orders.YYYYMMDD.log'); $deletedFiles = $rotate->deleteByFilenameTime('3 months');
基于自定义回调
根据自定义回调函数删除文件,如果您需要执行更复杂的代码来评估是否应删除文件,这非常有用。例如,删除所有名为 1000.jpg 及以下的所有图像文件
use studio24\Rotate\Delete; use studio24\Rotate\DirectoryIterator; $rotate = new Delete('path/to/logs/*.jpg'); $deletedFiles = $rotate->deleteByCallback(function(DirectoryIterator $file){ if ($file->getBasename() <= 1000) { return true; } return false; });
DirectoryIterator
回调函数必须接受一个参数 $file
,其类型为 \studio24\Rotate\DirectoryIterator
。
除了正常的 SPL DirectoryIterator 方法外,该迭代器还具有以下方法。
isMatch()
- 当前文件是否匹配我们正在寻找的文件名模式hasDate()
- 当前文件名中是否包含日期时间getFilenameDate()
- 返回当前文件的日期时间(作为 DateTime 对象)
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。