前期准备
确认核心参数
先登录帝国CMS后台,找到系统设置-系统参数设置-附件设置,记录以下3个路径:
- 附件存放目录:默认是/d/file/,如果自己修改过请务必记准绝对路径或相对根目录的路径
- 附件附件表前缀:默认是phome_,记准这个前缀用于后续查询有效缓存的SQL过滤
备份必要文件
必须做2步备份,防止误删:
- 通过FTP工具(如FileZilla,下载地址:https://filezilla-project.org/download.php?type=client)或宝塔面板文件管理,将附件存放目录下的cache子文件夹压缩备份
- 登录数据库管理工具(如phpMyAdmin,宝塔面板默认自带),备份phome_ecms_attachment主附件表
方案一:宝塔面板/SSH手动筛选+删除(适合略懂服务器的用户)
步骤1:生成有效缓存文件列表(SQL导出)
登录phpMyAdmin,选择帝国CMS对应的数据库,点击左侧SQL标签,输入并执行以下SQL语句:
```sql
SELECT CONCAT('/d/file/cache/', filepath, '/', filename) AS valid_cache_path FROM phome_ecms_attachment WHERE filepath LIKE 'cache/%';
```
注意:如果附件目录或表前缀修改过,请替换语句中的/d/file/cache/和phome_为自己的参数。执行后点击导出,格式选择CSV,勾选仅数据,取消所有其他勾选,保存为valid_cache.csv到本地。
步骤2:上传并运行对比清理脚本(PHP单文件)
将以下代码复制到本地编辑器,保存为del_invalid_cache.php,注意修改顶部的3个配置参数:
```php
";
}
} else {
if (!isset($valid_files[$relative_path])) {
unlink($full_path);
echo "删除无效文件: {$relative_path}
";
}
}
}
}
// 3. 执行清理(建议先注释掉unlink和rmdir,打印日志确认无误后再取消)
scan_and_delete($cache_dir, $valid_files);
echo '
清理完成!请务必检查附件功能是否正常!';
?>
```
通过FTP或宝塔文件管理,将valid_cache.csv和del_invalid_cache.php上传到帝国CMS的根目录(和index.php同级)。

先安全预检:打开脚本代码,在unlink($full_path);和rmdir($full_path);前面各加一行//注释掉,然后访问网站地址+/del_invalid_cache.php,确认打印的“删除”项都是陌生或旧的缓存。
确认无误后,删除那两行//取消注释,重新访问地址执行正式清理。
清理完成后,立即通过FTP或宝塔删除del_invalid_cache.php和valid_cache.csv,防止被他人恶意访问。
方案二:纯后台友好一键脚本(无需FTP/数据库管理,适合纯小白)
将以下代码复制到本地编辑器,保存为safe_del_cache.php,不需要修改任何默认参数(自动读取帝国CMS配置):
```php
fetch1("select userid,username,password,rnd from {$dbtbpre}enewsuser where userid='$userid'");
if($user['userid']&&$user['password']==$password&&$user['rnd']==$rnd)
{
$ecmscheck=1;
}
}
db_close();
if(!$ecmscheck)
{
die('请先登录帝国CMS后台!');
}
// 初始化配置
$cache_dir = ECMS_PATH.$public_r['fileurl'].'cache';
$prefix_removed = $public_r['fileurl'].'cache';
// 1. 从数据库获取有效缓存列表
$link=db_connect();
$empire=new mysqlquery();
$valid_files = [];
$sql=$empire->query("select filepath,filename from {$dbtbpre}ecms_attachment where filepath like 'cache/%'");
while($r=$empire->fetch($sql))
{
$relative_path = $r['filepath'].'/'.$r['filename'];
$relative_path = substr($relative_path, 6); // 去掉开头的cache/
if(!empty($relative_path))
{
$valid_files[$relative_path] = true;
}
}
db_close();
// 2. 递归遍历对比删除(同样先注释删除代码预检)
$delete_count = 0;
$dir_count = 0;
function scan_and_delete($dir, $valid_files, $current_prefix = '') {
global $delete_count, $dir_count;
$files = scandir($dir);
foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;
$full_path = $dir . '/' . $file;
$relative_path = $current_prefix ? $current_prefix . '/' . $file : $file;
if (is_dir($full_path)) {
scan_and_delete($full_path, $valid_files, $relative_path);
if (count(scandir($full_path)) === 2) {
rmdir($full_path);
$dir_count++;
echo "删除空目录: {$relative_path}
";
}
} else {
if (!isset($valid_files[$relative_path])) {
unlink($full_path);
$delete_count++;
echo "删除无效文件: {$relative_path}
";
}
}
}
}
// 3. 执行预检或正式清理
if ($_GET['action'] === 'do') {
scan_and_delete($cache_dir, $valid_files);
echo "
清理完成!共删除 {$delete_count} 个无效文件,{$dir_count} 个空目录。请删除本脚本!";
} else {
echo '
安全预检模式:';
scan_and_delete($cache_dir, $valid_files);
echo "
确认无误后,点击
正式清理";
}
?>
```
上传到帝国CMS根目录,先登录后台保持登录状态,然后访问网站地址+/safe_del_cache.php进入安全预检,确认后点击“正式清理”按钮。
清理完成后立即删除脚本文件。
后期维护
可以每个月或在批量更新内容后,使用方案二的脚本快速清理一次,避免无效缓存占用服务器空间。