织梦经常产生垃圾静态文件怎么处理
织梦DedeCMS开启静态生成后,随着内容更新会不断产生静态 HTML 文件和缓存文件。文章删除、栏目调整后,旧的静态文件往往残留不被清理,长期累积导致服务器空间被大量占用,甚至影响网站正常运行。本文系统讲解垃圾静态文件的识别与清理方法。
一、垃圾静态文件产生的原因
1. 删除文章未清理静态文件
在后台删除文章时,织梦只删除数据库记录,对应的静态 HTML 文件(/a/栏目/年月日/id.html)仍残留在服务器上。
2. 重新生成未覆盖旧文件
修改文章保存路径规则后重新生成,新文件写入新目录,旧目录的原文件成为垃圾文件。
3. 缓存文件持续累积
/data/tplcache/ 模板缓存、/data/sessions/ 会话文件、/data/cache/ 数据缓存,运行中不断生成且不自动清理。
二、识别垃圾文件的位置
1. 静态内容目录
// 默认静态生成路径 /a/ 下 /a/news/2024/0101/123.html 文章静态页 /a/list_1.html 栏目列表页 /a/index.html 栏目首页 // 检查无对应记录的孤立文件 SELECT aid FROM dede_arctiny WHERE aid NOT IN (SELECT id FROM dede_archives);
2. 缓存目录
/data/tplcache/ 模板编译缓存 /data/cache/ 数据缓存 /data/sessions/ 会话文件 /data/uploads/ 上传文件(含被删除文章的图片)
三、自动化清理方案
1. 编写孤立静态文件清理脚本
// clean_static.php 上传到根目录运行
<?php
require_once(dirname(__FILE__).'/include/common.inc.php');
// 获取所有有效文章ID
$dsql->SetQuery("SELECT id FROM dede_archives");
$dsql->Execute();
$valid_ids=array();
while($row=$dsql->GetArray()){
$valid_ids[]=$row['id'];
}
// 扫描静态目录
$static_dir=DEDEROOT.'/a';
$files=glob($static_dir.'/*/*/*/*.html');
$deleted=0;
foreach($files as $file){
// 提取文件名中的文章ID
$filename=basename($file, '.html');
$aid=intval($filename);
if($aid && !in_array($aid, $valid_ids)){
@unlink($file);
$deleted++;
}
}
echo "已清理孤立静态文件:{$deleted}个\n";
?>
2. 定时清理缓存目录
// cron 定时任务,每天凌晨3点执行 0 3 * * * find /www/wwwroot/site/data/tplcache -name "*.inc" -mtime +1 -delete 0 3 * * * find /www/wwwroot/site/data/sessions -name "sess_*" -mtime +1 -delete 0 3 * * * find /www/wwwroot/site/data/cache -name "*.json" -mtime +7 -delete
3. 清理无引用的附件文件
// 检查上传目录中未被文章引用的图片
<?php
$dsql->SetQuery("SELECT body FROM dede_addonarticle");
$dsql->Execute();
$used_files=array();
while($row=$dsql->GetArray()){
preg_match_all('/uploads\/(.*?)"/', $row['body'], $matches);
$used_files=array_merge($used_files, $matches[1]);
}
$upload_dir=DEDEROOT.'/uploads/allimg';
$files=glob($upload_dir.'/*/*/*.*');
$orphan=0;
foreach($files as $file){
$relative=str_replace(DEDEROOT.'/', '', $file);
if(!in_array(str_replace('uploads/', '', $relative), $used_files)){
// 建议先列出确认后再删除
$orphan++;
}
}
echo "发现无引用附件:{$orphan}个\n";
?>
删除文件前务必先完整备份。建议先运行脚本仅列出待删除文件清单,人工抽查确认无误后,再开启实际删除逻辑。误删正常文章的静态文件会导致页面 404。
四、宝塔面板定时清理配置
1. 创建计划任务
宝塔面板 - 计划任务 - 添加任务:
- 任务类型:Shell脚本
- 任务名称:织梦垃圾文件清理
- 执行周期:每天 03:00
- 脚本内容:
#!/bin/bash
WEBROOT=/www/wwwroot/site
# 清理1天前的模板缓存
find $WEBROOT/data/tplcache -name "*.inc" -mtime +1 -exec rm -f {} \;
# 清理过期会话
find $WEBROOT/data/sessions -name "sess_*" -mtime +1 -exec rm -f {} \;
# 清理临时上传文件
find $WEBROOT/data/uploads/tmp -mtime +1 -exec rm -f {} \;
echo "清理完成 $(date)"
2. 磁盘空间监控
宝塔 - 计划任务: - 任务类型:磁盘监控 - 当磁盘使用率超过 80% 时发送告警邮件 - 同时触发紧急清理脚本
五、从源头减少垃圾文件
1. 删除文章时同步清理静态文件
修改 /dede/archives_do.php 中的删除逻辑,在删除数据库记录的同时删除静态文件:
// 在删除文章的代码块中追加
$arcurl=GetFileUrl($arcID, $typeid, $senddate, $title, $ismake, $rank, $namerule, $artdir);
$htmlfile=DEDEROOT.$arcurl;
if(file_exists($htmlfile)){
@unlink($htmlfile);
}
// 删除缩略图
if($litpic) @unlink(DEDEROOT.$litpic);
2. 定期重新生成全站
每月执行一次「一键更新网站」,重新生成所有静态页面,确保静态文件与数据库记录一致。生成前先清理旧的静态目录。
3. 缩短缓存过期时间
// 系统基本参数 - 性能选项 - 模板缓存时间:3600秒 - 数据缓存时间:1800秒 - 自动清理过期缓存:开启
六、注意事项
清理脚本必须在低峰期运行,避免与用户访问和生成任务冲突。清理过程中网站可能短暂异常,建议设置维护提示页。附件文件清理需格外谨慎,文章引用的图片可能存在于自定义字段或多篇文章中,删除前需全文检索确认。清理完成后检查网站核心页面访问是否正常。
垃圾静态文件管理是织梦站点运维的长期工作,建议建立定期清理机制而非临时处理。通过定时任务自动化执行清理,配合磁盘监控告警,可在文件累积到影响业务前及时释放空间。同时从删除逻辑源头入手,让程序在删除内容时自动清理关联文件,从根本上减少残留,保持服务器空间健康可持续使用。