[array viewthread_profileside/0]
[array viewthread_avatartop/0]
[array viewthread_avatar/0]
[array viewthread_sidetop/0]
管理员
自由的灵魂
- 积分
- 107438
- 主题
- 5631
- 回帖
- 26662
- 注册时间
- 2003-4-10
- 最后登录
- 2026-10-2
[array viewthread_sidebottom/0]
|
发表于 4 小时前
|
显示全部楼层
|阅读模式
[array viewthread_postheader/0]
[ad thread/a_pt/2/0]
[array viewthread_posttop/0]
[ad thread/a_pr/3/0]
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册 [string global_login_text]
×
1、问题缘起
邮件队列表 dx_common_mail_queue 已累积 5824 行记录,最早的发送成功(status=1)记录可追溯到 6 个月前(4 月份)。队列处理脚本每 5 分钟执行一次,长期运行下记录持续堆积,表体积不断膨胀。
探讨过程中提出的问题:
- 是否可以在 CLI 自动脚本中加入滚动删除机制?
- 每次执行都清理,还是每天只清理一次?
- 3 个月保留期是否过长?能否更短?
- 是否给 status 加索引以提升效率?
分析结论:
- 成功记录(status=1)业务价值低,用户反馈期通常 30 天内
- 失败记录(status=2)有排查价值,建议保留更久
- 当前数据量(5824 行)下索引无实际收益,暂不加
2、解决方案
(1)简要技术分析:
在 mail_queue_cli.php 开头加入分级清理逻辑,每天首次执行时删除超过保留期的记录:成功记录保留 30 天,失败记录保留 180 天,待发记录永久保留。用标记文件控制执行频率。
(2)修改文件列表:
| 操作 | 文件路径 | | 修改 | /api/mail_queue_cli.php |
(3)关键代码段:
- // ========== 清理历史记录(每天一次,分级保留)==========
- $clean_flag_file = '/tmp/mail_queue_clean_flag.txt';
- $today = date('Y-m-d');
- $last_clean = file_exists($clean_flag_file) ? file_get_contents($clean_flag_file) : '';
- if ($last_clean != $today) {
- // 成功记录:保留 30 天(用户反馈期已足够)
- $success_limit = TIMESTAMP - 30 * 86400;
- DB::query("DELETE FROM " . DB::table('common_mail_queue') . " WHERE status = 1 AND dateline < $success_limit");
-
- // 失败记录:保留 180 天(便于排查历史问题)
- $fail_limit = TIMESTAMP - 180 * 86400;
- DB::query("DELETE FROM " . DB::table('common_mail_queue') . " WHERE status = 2 AND dateline < $fail_limit");
-
- file_put_contents($clean_flag_file, $today);
- echo date('Y-m-d H:i:s') . " 清理完成(成功>30天,失败>180天)\n";
- }
- // ========== 清理结束 ==========
复制代码
3、最终实现效果
| 记录类型 | 保留期 | 说明 | | status=0(待发) | 永久 | 未发送的必须保留,不受清理影响 | | status=1(成功) | 30 天 | 用户反馈期已足够,释放空间 | | status=2(失败) | 180 天 | 保留较久,便于排查历史发送问题 |
执行频率:每天一次(通过 /tmp/mail_queue_clean_flag.txt 标记控制)
效果预估:清理后表体积可稳定在合理范围,避免无限膨胀。
4、重要技术沉淀(需更新到固化摘要)
- 二十二、邮件队列表分级清理(2026-10-02)
- 清理脚本:api/mail_queue_cli.php(内嵌清理逻辑)
- 清理策略:分级保留
- - status=0(待发):永久保留
- - status=1(成功):保留 30 天
- - status=2(失败):保留 180 天
- 执行频率:每天一次(标记文件 /tmp/mail_queue_clean_flag.txt)
- 索引建议:当前 5824 行无需索引;超 2 万行时加 (status, id) 和 (status, dateline)
- 涉及文件:api/mail_queue_cli.php
复制代码
踩坑点:
| 踩坑 | 正确做法 | | 每次执行都清理 | 用标记文件控制为每天一次,减少数据库压力 | | 一刀切删除所有旧记录 | 分级保留:成功短、失败长、待发不删 | | 盲目加 status 单列索引 | 选择性太低,建议用复合索引或数据量大时再加 |
5、进一步优化可能性
| 方向 | 说明 | 优先级 | | 保留期后台可配 | 将 30/180 天存入 setting 表 | 低 | | 清理行数日志 | 记录每次删除的行数,便于监控 | 低 | | 数据量增长后加索引 | 超过 2 万行时添加复合索引 | 中 |
|
[array viewthread_postbottom/0]
|