主要是用到了scandir函数,利用此函数获取某个路径下的所有文件以及目录。递归调用.
再结合crontab定期清理。图片的话是根据数据库的url清除的。清理完图片清理目录、
<?php
// 定义清理的目录
$directory = ROOT_PATH . '/images/clock/';
// 清理目录
deleteDirectory($directory);
/**
* 递归删除空目录
* @param $d
* @return void
*/
function deleteDirectory($d){
$files = scandir($d);
foreach ($files as $file) {
// 忽略当前目录和上级目录
if($file === '.' || $file === '..') {
continue;
}
// 当前路径
$newFile = $d . '/' . $file;
// 如果是目录,递归调用
if(isChild($newFile) === 1) {
deleteDirectory($newFile);
}
// 如果没有任何东西删除
if(isChild($newFile) === 3) {
rmdir($newFile);
}
}
}
/**
* 判断目录下是否有子目录或文件
* @param $d string (路径)
* @return int 1:有子目录 2:有文件 3:没有子目录和文件
*/
function isChild($d){
$files = scandir($d);
foreach ($files as $file) {
// 忽略当前目录和上级目录
if($file === '.' || $file === '..') {
continue;
}
// 当前路径
$newFile = $d . '/' . $file;
if(is_dir($newFile)) {
return 1;
}else{
return 2;
}
}
return 3;
}
第二种直接递归
// 定义清理的目录
$directory = ROOT_PATH . '/images/clock/';
// 清理目录
deleteDirectory($directory,$directory);
function deleteDirectory($d,$root){
$files = array_diff(scandir($d), array('.','..'));
// 如果目录为空,删除目录
if(!$files){
rmdir($d);
return 1;
}
foreach ($files as $file) {
// 当前路径
$currentFile = $d . '/' . $file;
if(is_dir($currentFile)){
deleteDirectory($currentFile,$root);
}
}
// 再次判断目录是否为空
if(!array_diff(scandir($d), array('.','..')) && $d != $root){
rmdir($d);
}
}