当前位置:   article > 正文

Thinkphp获取项目最近更改变动的所有文件

Thinkphp获取项目最近更改变动的所有文件

导读:

企业级的网站项目都是要不断优化迭代更新的,做为一名后端程序员,在编写更新模块时,如何能快速获取最近修改的文件,然后打包压缩成更新补丁呢?我们先来看一下最终效果图:

 步骤:

一、在extend扩展目录创建一个名为ChangesFile.php的文件,代码如下:

  1. <?php
  2. /**
  3. * 获取网站最近更新变动的文件列表
  4. * author:元歌
  5. * date:2023年4月25日
  6. */
  7. class ChangesFile{
  8. private $fileArray = array();
  9. // 过滤文件
  10. private $extFilter = [
  11. '.log',
  12. '.txt',
  13. '.env',
  14. '.git',
  15. '.idea',
  16. '.vscode',
  17. ];
  18. // 过滤的目录或文件
  19. private $packageFilter = [
  20. 'vendor',
  21. 'runtime',
  22. 'cache',
  23. 'uploads',
  24. 'thinkphp5.0.24'
  25. ];
  26. /**
  27. * 查找最近1天内修改的文件
  28. */
  29. public function getFileList($root){
  30. // 指定开始的时间
  31. $checkTime = strtotime ("-1 day");
  32. $this->find($root, function (SplFileInfo $item, bool $isDir) use ($root, $checkTime) {
  33. //文件路径
  34. $filePath = $item->getPathname();
  35. //2.过滤不在日期范围内的
  36. if((int)$item->getMTime() < $checkTime){
  37. return;
  38. }
  39. if ($checkTime > max($item->getMTime(), $item->getCTime())) {
  40. return;
  41. }
  42. //3.排除目录
  43. if(!empty($filePath) && !$isDir){
  44. //文件名称,或者使用basename($item)
  45. $filename = $item->getFilename();
  46. //最近更新日期
  47. $recentChangesTime = date("Y-m-d H:i:s",$item->getMTime());
  48. array_push($this->fileArray,[
  49. "name" => $filename,
  50. "time" => $recentChangesTime,
  51. "path" => $filePath
  52. ]);
  53. }
  54. /*
  55. $savePath = str_replace($root, $root . DIRECTORY_SEPARATOR . '__package', $filePath);
  56. $saveDir = $isDir ? $savePath : dirname($savePath);
  57. //创建目录
  58. if (!is_dir($saveDir)) {
  59. $result = mkdir($saveDir, 0777, true);
  60. echo 'mkdir: ', $saveDir, $result ? ' successfully' : ' failure', PHP_EOL;
  61. }
  62. //复制文件
  63. if (!$isDir) {
  64. $result = copy($filePath, $savePath);
  65. echo 'copy: ', $filePath, $result ? ' successfully' : ' failure', PHP_EOL;
  66. }
  67. */
  68. });
  69. return $this->fileArray;
  70. }
  71. function find(string $root, Closure $filter): void
  72. {
  73. $items = new FilesystemIterator($root);
  74. /** @var SplFileInfo $item */
  75. foreach ($items as $item) {
  76. //过滤目录
  77. $dirtemp=dirname($item);
  78. $dirname = substr($dirtemp, strrpos($dirtemp, '/') + 1);
  79. if (!empty($dirname) && in_array($dirname, $this->packageFilter)) {
  80. continue;
  81. }
  82. if ($item->isDir() && !$item->isLink()) {
  83. $filter($item, true);
  84. $this->find($item->getPathname(), $filter);
  85. continue;
  86. }
  87. $filter($item, false);
  88. }
  89. }
  90. }

二、在控制器里调用刚才添加的扩展插件ChangesFile.php,方法如下:

  1. public function update(){
  2. //1.获取最近改动的文件(ROOT_PATH 为Thinkphp5.0的网站根目录)
  3. $changesFile = new \ChangesFile();
  4. $list = $changesFile->getFileList(ROOT_PATH);
  5. //2.按照日期重新排序
  6. $sort=array_column($list,"time");
  7. array_multisort($sort,SORT_DESC,$list);
  8. echo "<pre>";
  9. var_dump($list);
  10. return view();
  11. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号