联系信息

php删除网站中不曾调用的图片(垃圾文件)的方法

2020-12-18 15:45 By 致远 3238
当前位置: 企业网站建设 > ThinkPHP > php删除网站中不曾调用的图片(垃圾文件)的方法

如题。网站程序本身的不完善,导致网站运行时间越久垃圾文件就越多,人为去处理那些垃圾文件是不现实的,还好php能帮我们搞定。

如:写一篇文章,文章中有配图,而在删除这篇文章的时候并没有删除相关图片,那么这些图片就是孤立的、没有用的,也就是我前面提到的垃圾文件。由于此类操作,尤其是门户网站,将会严重占用硬盘空间,甚至影响网络响应速度。

原理其实很简单:

1、遍历素材文件夹(一般为上传文件夹,正常的话只有一个总的目录,如果有多个,那就多次遍历吧)

2、遍历其下的所有文件夹及其文件

3、查询数据库相关字段看该文件是否有引用,如果有,继续下一个文件的判断,如果没有,删除。

这里会有几个问题

1、速度上并不理想,好在比没有办法要好一点点

2、查询数据库的时候一定要确保所有可能调用的数据表及其字段,否则~恭喜你,你可以跑路了!

核心代码如下:


set_time_limit(0);
$floder=$this->_folder('/upfiles/');//读取文件目录中的所有子目录,我这里upfiles下没有直接存放文件,都在子目录中,所以没有处理这里的文件
foreach ($floder as $value) {
    $pics=$this->_readPic('./upfiles/'.$value);//读取目录中的所有文件
    foreach ($pics as $val) {
        $pic=trim($val,'.');//格式化图片地址,因为数据库中存放的没有.
        $ex=M('Article')->where('cont like "%'.$pic.'%"')->find();
        if($ex) continue;//查询一个表会调用该图片的一个字段,如果找到了就没必要继续查其他表及其他字段了
        $ex=M('Pics')->where('pics like "%'.$pic.'%"')->find();
        if($ex) continue;
        $ex=M('User')->where('pic="'.$pic.'"')->find();
        if($ex) continue;
        unlink(APP_PATH.trim($pic,'/'));//删除文件
    }
}


读取文件夹的子函数:


private function _folder($path) {
    $path=getcwd()."\\".$path;
    $handle = opendir($path);
    $itemArray=array();
    while (false !== ($file = readdir($handle))) {
        $floder=$path.$file;
        if (($file=='.')||($file=='..')){
        }elseif (is_dir($floder) && !stripos($floder,'-')) {
                $itemArray[$file]=$file;
            }else{
                //array_push($itemArray, $file);
            }
        }
    return $itemArray;
}


读取文件的子函数:


private function _readPic($path){
    $dir .= substr($dir, -1) == '/' ? '' : '/';
    $dirInfo = array();
    foreach (glob($dir.'*') as $v) {
        if(stripos($v,'thumb_')) continue;
        $dirInfo[] = $v;
        if(is_dir($v)){
            $dirInfo = array_merge($dirInfo, $this->_readPic($v));
        }
    }
    return $dirInfo;
}


© 致远 2020-12-18,原创内容,转载请注明出错:php删除网站中不曾调用的图片(垃圾文件)的方法

留下您的评论

>