以下提供两款适配帝国CMS的静态文件清理脚本(Shell + PHP),分别适配不同服务器环境,兼顾安全性与易用性,可根据你的服务器配置选择使用:
一、Shell脚本(推荐Linux服务器)
功能说明
1.对比数据库中已发布文章的URL,删除静态目录中“数据库不存在”的.html文件;
2.仅删除文件、不删目录,避免误删核心目录;
3.保留最近7天生成的文件(防止刚生成但数据库未同步的情况);
4.生成清理日志,方便追溯操作。
脚本代码(保存为 clear_ecms_html.sh)
#!/bin/bash
# ===================== 配置项(根据你的环境修改)=====================
# 帝国CMS静态文件根目录(必填,如 /www/wwwroot/你的域名/html)
HTML_DIR="/www/wwwroot/your_domain/html"
# 数据库信息(必填)
DB_HOST="localhost"
DB_USER="root"
DB_PASS="你的数据库密码"
DB_NAME="你的帝国CMS数据库名"
# 保留最近N天的文件(防止误删新生成的文件,默认7天)
KEEP_DAYS=7
# 日志文件路径
LOG_FILE="/www/wwwroot/your_domain/ecms_clear_log.txt"
# ===================================================================
# 检查静态目录是否存在
if [ ! -d "$HTML_DIR" ]; then
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 错误:静态目录 $HTML_DIR 不存在!" >> $LOG_FILE
exit 1
fi
# 从数据库导出所有已发布文章的静态URL(适配帝国CMS默认表结构)
# 如需适配其他模型,修改表名(如 phome_ecms_news 改为对应模型表)
mysql -h$DB_HOST -u$DB_USER -p$DB_PASS $DB_NAME -N -e "
SELECT CONCAT('/html/', filepath, filename, '.html')
FROM phome_ecms_article
WHERE ischecked=1 AND classid>0;
" > /tmp/ecms_valid_urls.tmp
# 遍历静态目录下所有.html文件,排除最近KEEP_DAYS天的文件
find $HTML_DIR -type f -name "*.html" -mtime +$KEEP_DAYS | while read file; do
# 转换文件路径为URL格式(如 /www/xxx/html/2025/12/10/1.html → /html/2025/12/10/1.html)
file_url="/html${file#$HTML_DIR}"
# 检查URL是否在有效列表中
if ! grep -q "$file_url" /tmp/ecms_valid_urls.tmp; then
# 删除冗余文件并记录日志
rm -f "$file"
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 删除冗余文件:$file" >> $LOG_FILE
fi
done
# 清理临时文件
rm -f /tmp/ecms_valid_urls.tmp
# 日志收尾
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 冗余文件清理完成!" >> $LOG_FILE
exit 0使用方法
1.修改配置项:替换 HTML_DIR、DB_HOST、DB_USER、DB_PASS、DB_NAME 为你的实际信息;
2.赋予执行权限:chmod +x clear_ecms_html.sh;
3.测试执行:./clear_ecms_html.sh(先测试,确认日志无异常后再定时执行);
4.定时执行(可选):添加到crontab,每周执行一次:
crontab -e # 新增一行(每周日凌晨2点执行) 0 2 * * 0 /www/wwwroot/your_domain/clear_ecms_html.sh
二、PHP脚本(适配Windows/Linux服务器)
功能说明
1.无需服务器命令行权限,通过浏览器即可执行;
2.增加“模拟清理”模式,先预览待删除文件,再实际删除;
3.适配帝国CMS多模型(文章、新闻、下载等)。
脚本代码(保存为 clear_ecms_html.php,放在网站根目录)
<?php
/**
* 帝国CMS静态文件清理脚本
* 使用前请先备份静态目录!
*/
header("Content-Type: text/html; charset=utf-8");
// ===================== 配置项 =====================
$config = [
// 数据库配置
'db' => [
'host' => 'localhost',
'user' => 'root',
'pass' => '你的数据库密码',
'name' => '你的帝国CMS数据库名',
'charset' => 'utf8'
],
// 静态文件根目录(绝对路径)
'html_dir' => '/www/wwwroot/your_domain/html',
// 保留最近N天的文件(默认7天)
'keep_days' => 7,
// 模拟清理(true=只预览不删除,false=实际删除)
'simulate' => true,
// 需要清理的模型表(可添加多个,如 phome_ecms_news、phome_ecms_download)
'tables' => ['phome_ecms_article']
];
// ==================================================
// 连接数据库
$link = mysqli_connect(
$config['db']['host'],
$config['db']['user'],
$config['db']['pass'],
$config['db']['name']
);
if (!$link) {
die("数据库连接失败:" . mysqli_connect_error());
}
mysqli_set_charset($link, $config['db']['charset']);
// 获取所有有效静态URL
$validUrls = [];
foreach ($config['tables'] as $table) {
$sql = "SELECT CONCAT('/html/', filepath, filename, '.html') AS url
FROM {$table}
WHERE ischecked=1 AND classid>0";
$result = mysqli_query($link, $sql);
while ($row = mysqli_fetch_assoc($result)) {
$validUrls[] = $row['url'];
}
}
mysqli_close($link);
// 遍历静态目录
$deleteCount = 0;
$deleteFiles = [];
$keepTime = time() - $config['keep_days'] * 86400; // 保留时间戳
function scanDir($dir, $config, $validUrls, &$deleteCount, &$deleteFiles, $keepTime) {
$files = scandir($dir);
foreach ($files as $file) {
if ($file == '.' || $file == '..') continue;
$fullPath = $dir . '/' . $file;
// 目录递归遍历
if (is_dir($fullPath)) {
scanDir($fullPath, $config, $validUrls, $deleteCount, $deleteFiles, $keepTime);
}
// 处理.html文件
if (is_file($fullPath) && pathinfo($fullPath, PATHINFO_EXTENSION) == 'html') {
// 跳过最近N天的文件
if (filemtime($fullPath) > $keepTime) continue;
// 转换为URL格式
$fileUrl = str_replace($config['html_dir'], '/html', $fullPath);
// 检查是否在有效列表中
if (!in_array($fileUrl, $validUrls)) {
$deleteFiles[] = $fullPath;
if (!$config['simulate']) {
unlink($fullPath);
}
$deleteCount++;
}
}
}
}
// 开始扫描
scanDir($config['html_dir'], $config, $validUrls, $deleteCount, $deleteFiles, $keepTime);
// 输出结果
echo "<h3>帝国CMS静态文件清理结果</h3>";
echo "<p>模式:" . ($config['simulate'] ? "模拟清理(未实际删除)" : "实际清理") . "</p>";
echo "<p>扫描目录:{$config['html_dir']}</p>";
echo "<p>保留最近:{$config['keep_days']} 天的文件</p>";
echo "<p>待删除文件总数:{$deleteCount} 个</p>";
if (!empty($deleteFiles)) {
echo "<h4>待删除文件列表:</h4>";
echo "<ul>";
foreach ($deleteFiles as $f) {
echo "<li>{$f}</li>";
}
echo "</ul>";
}
// 关闭模拟模式(测试无误后改为false)
if ($config['simulate']) {
echo "<p style='color:red;'>提示:当前为模拟模式,如需实际删除,请将配置项 'simulate' 改为 false!</p>";
}
?>使用方法
1.修改配置项:替换数据库信息、html_dir 等为实际值;
2.先设置 simulate = true,通过浏览器访问 http://你的域名/clear_ecms_html.php,预览待删除文件;
3.确认无异常后,将 simulate = false,再次访问执行实际删除;
4.执行完成后,建议删除该脚本(避免安全风险)。
重要注意事项
1.必做备份:执行前务必备份静态目录(/html/)和数据库,防止误删;
2.权限检查:确保脚本有读取数据库、遍历/删除静态文件的权限;
3.适配模型:若你的网站使用了自定义模型(如新闻、下载),需修改脚本中的表名(如 phome_ecms_article 改为对应模型表);
4.特殊URL规则:若你的静态URL不是默认的 /html/栏目路径/文件名.html,需调整脚本中URL拼接逻辑;
5.定时执行:Shell脚本适合长期定时清理,PHP脚本适合临时手动清理。