reportico/fresh-file

简单、快速、独立的PHP库,帮助您判断自上次检查以来是否有任何文件被修改 - 这份文件是否是新的?

8.1.0 2023-01-07 16:39 UTC

This package is auto-updated.

Last update: 2024-09-07 20:21:44 UTC


README

简单、快速、独立的PHP库,帮助您判断自上次检查以来是否有任何文件被修改 - 这份文件是否是新的?

脚本使用 filemtime() 函数(可选 clearstatcache())来获取文件的最后修改时间。所有修改时间都存储在一个缓存文件中(如果您使用多个实例,将创建多个文件),因此即使您为数百个文件使用此库,它也将在一个文件中存储它们的修改时间,并且缓存文件的读写将在每次请求时只进行一次。

使用方法

您可以根据需要创建多个实例,或者创建一个,并使用它作为通过类静态方法访问的虚拟单例。作为参数,您必须传递一个有效的缓存文件路径,其中脚本可以放置其元数据缓存。

// Create by object
$ff = new FreshFile($cacheFilepath);
// Create using factory
$ff = FreshFile::create($cacheFilepath);

一旦创建,您可以在任何地方使用您的对象,或者从静态调用中获取现有对象。

// Get existent object from class
$ff = FreshFile::get();

在第一种解决方案中,您必须在任何您想使用此对象的地方传递此对象。在第二种解决方案中,您只需创建对象一次,就可以在任何您想的地方使用它,而无需将其作为参数传递。

防止对象销毁时保存缓存

FreshFile默认情况下会在FreshFile对象销毁时(当PHP脚本/请求结束时)保存元数据文件。但在某些情况下,您可能需要防止这种情况。也许您的代码中出现了错误,您不会在缓存中保存当前收集的数据?为此,将第二个参数作为false传递以防止这种情况。从现在起,您必须手动关闭FreshFile并使用close()方法保存请求中收集的元数据。

// Prevent default save on destroy object
$ff = new FreshFile($cacheFilepath, false);
$ff = FreshFile::create($cacheFilepath, false);

// ...some code...

// At the end, close the FreshFile and save metadata
$ff->close();
注意!

如果您防止了在销毁时保存,那么您必须在脚本结束时始终关闭FreshFile对象!

用例

您可以同时检查一个或多个文件。如果您传递文件路径数组,并且任何文件(即使是100个中的1个)不是新的,则方法返回true - 这意味着文件是新的,需要对与此文件相关的某些操作进行操作。

// One file
if($ff->isFresh($file))
    // Do something...
    
// Many files
if($ff->isFresh([ $file1, $file2, $file3 ]))
    // Do something...

如果您检查文件是否为新的,则脚本将自动更新此文件的元数据,下次您询问对象相同的文件是否为新的,则脚本返回false - 这意味着该文件不需要更新。 即使您在同一脚本/请求中再次逐行调用也是如此!!

var_dump($ff->isFresh($file)); // returns true
var_dump($ff->isFresh($file)); // returns false !!!
var_dump($ff->isFresh($file)); // returns false !!!

相关文件

您可以定义一个主文件的相关文件。当您使用导入编译LESS或SCSS文件、在配置文件中创建导入等时,这很有用。一旦传递了相关文件,脚本将检查这些相关文件是否为新的。如果主文件或任何相关文件发生变化,您将得到通知。

$ff->setRelatedFiles($file, $relatedFiles);
$ff->isFresh($file);

您也可以在第一次新鲜检查后设置相关文件。这可以在您检测到任何这些文件被修改,并且您想更新此文件的相关文件时很有用。

if($ff->isFresh($file))
{
    // Do something with Config, LESS, SCSS...
    
    // After compiling files in library, You can get imported files from library, and set
    // them into FreshFile object. Next time these files will also be checked if were modified.
    // FreshFile remember related files between requests.
    $relatedFiles = $object->getImportedFiles();
    $ff->setRelatedFiles($file, $relatedFiles);
}

许可

此代码在MIT许可证下授权。