requtize / fresh-file
简单、快速、独立的PHP库,帮助您确定自上次检查以来是否有任何文件被修改 - 这个文件是否新鲜?
Requires
- php: ~5.5 || ~7.1
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许可证授权。