帝国CMS静态文件清理脚本(Shell + PHP)介绍

作者:魔道寒武纪     信息来源:互联网     发布时间:2025-12-10     点击数:0    

以下提供两款适配帝国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脚本适合临时手动清理。