导读:
企业级的网站项目都是要不断优化迭代更新的,做为一名后端程序员,在编写更新模块时,如何能快速获取最近修改的文件,然后打包压缩成更新补丁呢?我们先来看一下最终效果图:
步骤:
一、在extend扩展目录创建一个名为ChangesFile.php的文件,代码如下:
<?php
/**
* 获取网站最近更新变动的文件列表
* author:元歌
* date:2023年4月25日
*/
class ChangesFile{
private $fileArray = array();
// 过滤文件
private $extFilter = [
'.log',
'.txt',
'.env',
'.git',
'.idea',
'.vscode',
];
// 过滤的目录或文件
private $packageFilter = [
'vendor',
'runtime',
'cache',
'uploads',
'thinkphp5.0.24',
'readme'
];
/**
* 查找最近1天内修改的文件
*/
public function getFileList($root){
// 指定开始的时间
$checkTime = strtotime ("-1 day");
$this->find($root, function (SplFileInfo $item, bool $isDir) use ($root, $checkTime) {
//文件路径
$filePath = $item->getPathname();
//1.过滤后缀名
$ext = pathinfo($item, PATHINFO_EXTENSION);
if (!empty($ext) && in_array(".".$ext, $this->extFilter)) {
return;
}
//2.过滤不在日期范围内的
if ($checkTime > max($item->getMTime(), $item->getCTime())) {
return;
}
//3.排除目录
if(!empty($filePath) && !$isDir){
//文件名称,或者使用basename($item)
$filename = $item->getFilename();
//最近更新日期
$ctime = date("Y-m-d H:i:s",$item->getCTime());
array_push($this->fileArray,[
"name" => $filename,
"time" => $ctime,
"path" => $filePath
]);
}
/*
$savePath = str_replace($root, $root . DIRECTORY_SEPARATOR . '__package', $filePath);
$saveDir = $isDir ? $savePath : dirname($savePath);
//创建目录
if (!is_dir($saveDir)) {
$result = mkdir($saveDir, 0777, true);
echo 'mkdir: ', $saveDir, $result ? ' successfully' : ' failure', PHP_EOL;
}
//复制文件
if (!$isDir) {
$result = copy($filePath, $savePath);
echo 'copy: ', $filePath, $result ? ' successfully' : ' failure', PHP_EOL;
}
*/
});
return $this->fileArray;
}
function find(string $root, Closure $filter): void
{
$items = new FilesystemIterator($root);
/** @var SplFileInfo $item */
foreach ($items as $item) {
//过滤目录
$dirtemp=dirname($item);
$dirname = substr($dirtemp, strrpos($dirtemp, '/') + 1);
if (!empty($dirname) && in_array($dirname, $this->packageFilter)) {
continue;
}
if ($item->isDir() && !$item->isLink()) {
$filter($item, true);
$this->find($item->getPathname(), $filter);
continue;
}
$filter($item, false);
}
}
}
二、在控制器里调用刚才添加的扩展插件ChangesFile.php,方法如下:
public function update(){
//1.获取最近改动的文件(ROOT_PATH 为Thinkphp5.0的网站根目录)
$changesFile = new \ChangesFile();
$list = $changesFile->getFileList(ROOT_PATH);
//2.按照日期重新排序
$sort=array_column($list,"time");
array_multisort($sort,SORT_DESC,$list);
echo "<pre>";
var_dump($list);
return view();
}