找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8|回复: 0

[维护日志] [2026-10-02] [优化] [邮件队列表分级清理] - 成功记录30天、失败记录180天自动清理

[复制链接]
  • 打卡等级:本地老炮

9337

威望

7452

金钱

1万

贡献

管理员

自由的灵魂

积分
107438
主题
5631
回帖
26662
注册时间
2003-4-10
最后登录
2026-10-2
发表于 3 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

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)关键代码段:

  1. // ========== 清理历史记录(每天一次,分级保留)==========
  2. $clean_flag_file = '/tmp/mail_queue_clean_flag.txt';
  3. $today = date('Y-m-d');
  4. $last_clean = file_exists($clean_flag_file) ? file_get_contents($clean_flag_file) : '';
  5. if ($last_clean != $today) {
  6.     // 成功记录:保留 30 天(用户反馈期已足够)
  7.     $success_limit = TIMESTAMP - 30 * 86400;
  8.     DB::query("DELETE FROM " . DB::table('common_mail_queue') . " WHERE status = 1 AND dateline < $success_limit");
  9.    
  10.     // 失败记录:保留 180 天(便于排查历史问题)
  11.     $fail_limit = TIMESTAMP - 180 * 86400;
  12.     DB::query("DELETE FROM " . DB::table('common_mail_queue') . " WHERE status = 2 AND dateline < $fail_limit");
  13.    
  14.     file_put_contents($clean_flag_file, $today);
  15.     echo date('Y-m-d H:i:s') . " 清理完成(成功>30天,失败>180天)\n";
  16. }
  17. // ========== 清理结束 ==========
复制代码





3、最终实现效果

记录类型保留期说明
status=0(待发)永久未发送的必须保留,不受清理影响
status=1(成功)30 天用户反馈期已足够,释放空间
status=2(失败)180 天保留较久,便于排查历史发送问题


执行频率:每天一次(通过 /tmp/mail_queue_clean_flag.txt 标记控制)

效果预估:清理后表体积可稳定在合理范围,避免无限膨胀。




4、重要技术沉淀(需更新到固化摘要)

  1. 二十二、邮件队列表分级清理(2026-10-02)

  2. 清理脚本:api/mail_queue_cli.php(内嵌清理逻辑)
  3. 清理策略:分级保留
  4.   - status=0(待发):永久保留
  5.   - status=1(成功):保留 30 天
  6.   - status=2(失败):保留 180 天
  7. 执行频率:每天一次(标记文件 /tmp/mail_queue_clean_flag.txt)
  8. 索引建议:当前 5824 行无需索引;超 2 万行时加 (status, id) 和 (status, dateline)
  9. 涉及文件:api/mail_queue_cli.php
复制代码


踩坑点:
踩坑正确做法
每次执行都清理用标记文件控制为每天一次,减少数据库压力
一刀切删除所有旧记录分级保留:成功短、失败长、待发不删
盲目加 status 单列索引选择性太低,建议用复合索引或数据量大时再加





5、进一步优化可能性

方向说明优先级
保留期后台可配将 30/180 天存入 setting 表低
清理行数日志记录每次删除的行数,便于监控低
数据量增长后加索引超过 2 万行时添加复合索引中
不懂就搜!点此搜点拨论坛。如果本坛没有,请尝试点此问AI,或跟帖提问。
发帖前注意看置顶帖。
不定期借助AI对点拨论坛陈年老帖进行挖坟回复,打扰勿怪!
你知道吗?多页主题可以用左右方向键快速翻页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|点拨论坛 |网站地图

GMT+8, 2026-10-2 11:31 , Processed in 0.685423 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表