如題。網站程序本身的不完善,導致網站運行時間越久垃圾文件就越多,人為去處理那些垃圾文件是不現實的,還好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刪除網站中不曾調用的圖片(垃圾文件)的方法