如题。网站程序本身的不完善,导致网站运行时间越久垃圾文件就越多,人为去处理那些垃圾文件是不现实的,还好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删除网站中不曾调用的图片(垃圾文件)的方法