PHP 删除网站上传没用的图片/文件,删除CMS数据库不存在的图片,清理服务器空间

本代码是根据行云海CMS来开发的,可以根据自己情况二次开发,

主要用于清理网站上传没用的图片(在数据库里面的不会被删)

代码如下:

<?php
/**
             ____________________________________________________
            /                                                    \
           |    _____________________________________________     |
           |   |                                             |    |
           |   |  C:\> _                                     |    |
           |   |                                             |    |
           |   |                                             |    |
           |   |                                             |    |
           |   |                                             |    |
           |   |          XiaoHe    QQ496631085              |    |
           |   |                                             |    |
           |   |                                             |    |
           |   |                                             |    |
           |   |                                             |    |
           |   |                                             |    |
           |   |                                             |    |
           |   |_____________________________________________|    |
           |                                                      |
            \_____________________________________________________/
                   \_______________________________________/
                _______________________________________________
             _-'    .-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.  --- `-_
          _-'.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.--.  .-.-.`-_
       _-'.-.-.-. .---.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-`__`. .-.-.-.`-_
    _-'.-.-.-.-. .-----.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-----. .-.-.-.-.`-_
 _-'.-.-.-.-.-. .---.-. .-----------------------------. .-.---. .---.-.-.-.`-_
:-----------------------------------------------------------------------------:
 * 清理文件ClearController
 * @Author: XiaoHe QQ496631085   VX:he4966
 * @Date:   2020-06-15 10:00:00
 * @Last Modified by:   gosea
 * @Last Modified time: 2020-06-16 16:00:00
 * 使用说明 ,本代码是放到行云海/App/Api/Controller/下面,清理文件,访问地址:  你的域名/api/clear/index
 * 手动导出你的数据库 改名文件或者$db的文件名,其余的参数自己配置一下
 */

namespace Api\Controller;
use Think\Controller;

class ClearController extends Controller {



    private $db = 'db.txt';           //需要被找的数据库一定要最新导出(手动放到根目录) 然后改名[[必改]]
    private $houzui = '.jpg|.png|.jpeg|.gif'; //需要被找的文件后缀 可以是pdf doc zip等    [[根据自己的情况修改]]
    private $delpath = "/uploads/img1";//                  //扫描的要删除的目录文件夹    [[根据自己的情况修改]]

    private $imgpaths=array();//图片img数组列表 以方便删除
    private $imgpaths_cunzai=array();//存在 的图片
    private $imgpaths_nocunzai=array();//不存在的图片


    private $delFileNames = 'deleteimgs.txt';
    private $mulu = 'mulu.txt';//文件夹目录
 
    private $stime;

    public function __construct()
    {
        $this->stime = time();//累计时间
    }

    public function __destruct(){
      echo "<br><H1>本次总耗时间".(time()-$this->stime)."</H1>"; //结束时间 
    }

    //自己封装的函数 方便调试
    function p($arr,$zhu=null){
      if(is_array($arr)){
        var_dump($arr);
      }else{
        echo "<br>".$zhu.$arr."<br>";
      }
    }





    public function index(){
      header('Content-type:text/html;charset=utf-8');
      echo '<ul class="breadcrumbs-custom-path">
              <li><a target="_blank" href="/api/clear/start">开始一键搜索扫描</a></li><br>
              <li><a target="_blank" href="/api/clear/scanimgdir">1扫描目录并保存</a></li><br>
              <li><a target="_blank" href="/'.$this->mulu.'">1-1查看扫描的目录</a></li><br>

              <li><a target="_blank" href="/api/clear/sanfile">1扫描文件并保存_需要扫描的文件后缀名:'.$this->houzui.'</a></li><br> 
              <li><a href="/'.$this->db.'">查看数据库</a></li><br>
            </ul>';
    }
    //扫描目录 并保存
    public function scanimgdir(){
      $run_path = $_SERVER['DOCUMENT_ROOT'].$this->delpath;//运行目录
      $scandir = $this->sandir($run_path);
      $this->xieConfig($this->mulu,$scandir);
    }

    //扫描文件 并找查
    public function scanfile(){
      $sandir = $this->readConfig($this->mulu);

    }





    //写配置文件(文件地址,写入的一维数组 )
    public function xieConfig($filepath,$arr){
      file_put_contents($filepath,implode($arr, ','));
    }
    //读一维数组配置
    public function readConfig($filepath){
      return explode(',',file_get_contents($filepath));
    }


    public function start(){

      $run_path = $_SERVER['DOCUMENT_ROOT'].$this->delpath;//运行目录
      $scandir = $this->sandir($run_path);
      $imgname = $this->scanimg($scandir);//文件名数组 以方便在数据库中查找 例如/qq496631085.png
      $content = file_get_contents($this->db);//获取数据内容 

      foreach ($imgname as $key => $file_name) {
        if(strpos($content,$file_name)>0){
          array_push($this->imgpaths_cunzai, $file_name);
          continue;
        }else{
          array_push($this->imgpaths_nocunzai, $file_name);
        }
      }

      p("QQ496631085  网站开发制作 微信小程序 后端开发************XiaoHe****************************************************************************************************************");
      echo "图片总共".sizeof($imgname)."张,不存在".sizeof($this->imgpaths_nocunzai)."............存在".sizeof($this->imgpaths_cunzai);

      p("不存在的图片:".sizeof($this->imgpaths_nocunzai)."张");

      p($this->imgpaths_nocunzai);

      file_put_contents($this->delFileNames,implode($this->imgpaths_nocunzai, ','));

     

      echo "已删除".$ci."张图片";
      if($this->imgpaths_nocunzai>0){
        echo '<a href="/'.$this->delFileNames.'">查看待删除的所有图片</a>';
        echo '<br><a href="/Api/Clear/deleteimgs">点击删除所有图片</a>';
      }else{
        p("没有可以删的图片了");
      }
      
    }

    //扫描目录
    public function sandir($path){
         $data  = scandir($path);
        foreach ($data as $key => $value) {
          // 判断最后一位是否小数点
          if(strpos($value,'.')>0  || $value=="." || $value==".."){
            unset($data[$key]);//删除有带.的目录(如.   ..   )
          }else{
            $data[$key] = $path.'/'.$value;
          }

        }

      return $data;
    }


    //扫描文件图片文件 
    /*
    如果是图片就加入到$this->imgpaths数组 并把文件名加入到 $imgdata数组中
    返回$imgdata
    */
    public function scanimg($patharr){
        $imgdata = array();
        foreach ($patharr as $key => $path) {

            $filesnames = scandir($path);
             // p($filesnames);
             foreach ($filesnames as $key => $filename){
               //判断是否是图片
              // echo $filename;
              if(strlen($filename)>4){
                $houzui = substr($filename,-4);

                if(strstr($this->houzui,$houzui)){
                  // echo  $path.'/'.$filename.'<br>';
                  array_push($this->imgpaths, $path.'/'.$filename);
                  array_push($imgdata, '/'.$filename);
                }
              }
                // array_push($imgdata,$value)             
          }                  
        }
        file_put_contents('paths.txt', implode($this->imgpaths, ','));
        return $imgdata;
    }


    // public function getPaths($run_path=""){
    //   if(file_exists('paths.txt')){
    //     $pathArr = explode(',',file_get_contents('paths.txt'));
    //     $this->imgpaths = $pathArr;
    //   }else{
    //     $scandir = $this->sandir($run_path);
    //     $imgname = $this->scanimg($scandir);
    //     // return $imgname;
    //   }
    // }

    public function deleteimgs(){


      $ci=0;
      $run_path = $_SERVER['DOCUMENT_ROOT'].$this->delpath;//运行目录
      $scandir = $this->sandir($run_path);
      $imgname = $this->scanimg($scandir);
      // $this->getPaths($run_path);

     
      $txt = file_get_contents($this->delFileNames);
      $this->imgpaths_nocunzai = explode(',',$txt);
      p($this->imgpaths_nocunzai);
      // exit;
      //字符到数组
         foreach ($this->imgpaths_nocunzai as $key => $path) {
        //查询具体路径.
        echo "<br>删除文件ing:".$path;
        foreach ($this->imgpaths as $rkey => $rootpath) {

          // if(strpos($rootpath,$path)){
            if(substr_count($rootpath,$path)>=1){

            if(unlink($rootpath)){//删除文件
               echo $roorpath."已删除<br>";
               $ci++;
             }
            
          }
        }
        
      }
      echo "共删除".$ci."张";
    }

    public function _empty() {
        header("HTTP/1.1 404 Not Found");
        header("Status: 404 Not Found");
        // header("Content-Type: text/html; charset=utf-8");
        // $this->display('Public:404');
        echo '404 Not Found';

    }



}

 

posted @ 2020-06-16 16:14  xiaohe520  阅读(269)  评论(0编辑  收藏  举报