studio24/rotate

文件旋转工具,可旋转并删除旧文件

v1.0.1 2019-02-02 13:04 UTC

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)。有关更多信息,请参阅 许可证文件

致谢