赞
踩
企业级的网站项目都是要不断优化迭代更新的,做为一名后端程序员,在编写更新模块时,如何能快速获取最近修改的文件,然后打包压缩成更新补丁呢?我们先来看一下最终效果图:
一、在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'
- ];
- /**
- * 查找最近1天内修改的文件
- */
- public function getFileList($root){
- // 指定开始的时间
- $checkTime = strtotime ("-1 day");
-
- $this->find($root, function (SplFileInfo $item, bool $isDir) use ($root, $checkTime) {
- //文件路径
- $filePath = $item->getPathname();
- //2.过滤不在日期范围内的
- if((int)$item->getMTime() < $checkTime){
- return;
- }
- if ($checkTime > max($item->getMTime(), $item->getCTime())) {
- return;
- }
- //3.排除目录
- if(!empty($filePath) && !$isDir){
- //文件名称,或者使用basename($item)
- $filename = $item->getFilename();
- //最近更新日期
- $recentChangesTime = date("Y-m-d H:i:s",$item->getMTime());
- array_push($this->fileArray,[
- "name" => $filename,
- "time" => $recentChangesTime,
- "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();
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。