040215-System模块job_runs清理命令开发.md 5.2 KB

System模块job_runs清理命令开发

时间: 2025年07月04日 02:15
任务: 在System模块创建清理job_runs表的命令,1小时调用一次,保留5天的数据

任务概述

为KKU Laravel项目的System模块创建专门的job_runs表清理命令,实现自动化的队列运行记录清理功能,保持数据库性能。

实施步骤

1. 创建清理命令 ✅

文件: app/Module/System/Commands/CleanJobRunsCommand.php

命令特性

  • 命令名称: system:clean-job-runs
  • 默认保留: 5天数据
  • 批处理: 默认1000条记录/批
  • 安全机制: 支持dry-run预览、强制执行、确认提示

命令参数

--days=5           # 保留天数,默认5天
--batch-size=1000  # 批处理大小,默认1000
--dry-run          # 预演模式,不实际删除
--force            # 强制执行,跳过确认

核心功能

  • 分批删除: 避免长时间锁表,每批处理1000条记录
  • 进度显示: 实时显示清理进度条
  • 统计预览: 按状态、队列统计待清理记录
  • 错误处理: 事务保护,异常回滚
  • 日志记录: 记录清理操作到系统日志

2. 修改SystemServiceProvider ✅

文件: app/Module/System/Providers/SystemServiceProvider.php

添加的功能

  • 命令注册: 在registerCommands()方法中注册清理命令
  • 定时任务: 在registerSchedules()方法中注册每小时执行的定时任务
  • 依赖导入: 添加必要的Schedule和Command类导入

定时任务配置

// 每小时清理job_runs表,保留5天数据
$schedule->command('system:clean-job-runs')
    ->hourly()
    ->description('清理job_runs表过期记录(保留5天)')
    ->withoutOverlapping() // 防止重复执行
    ->runInBackground(); // 后台运行

3. 注册ServiceProvider ✅

文件: config/app.php

在providers数组中添加了SystemServiceProvider的注册:

// System 模块
\App\Module\System\Providers\SystemServiceProvider::class,

功能验证

1. 命令帮助测试 ✅

php artisan system:clean-job-runs --help

输出正确的命令帮助信息,包含所有参数说明。

2. 预览模式测试 ✅

php artisan system:clean-job-runs --dry-run

测试结果:

  • 保留天数: 5天
  • 发现53304条需要清理的记录
  • 按状态统计:run(16707)、run-end(16707)、handle(6630)、runend-1(13260)
  • 按队列统计:Console(33414)、default(19890)
  • 最早记录:2025-06-24 05:22:04

3. 定时任务验证 ✅

php artisan schedule:list

确认定时任务正确注册:

0 * * * * php artisan system:clean-job-runs ......... Next Due: 45分钟后

4. 参数验证测试 ✅

php artisan system:clean-job-runs --days=10 --dry-run

保留10天时没有需要清理的记录,验证了时间过滤逻辑正确。

技术实现亮点

1. 安全的分批处理

  • 使用数据库事务保护每批操作
  • 批次间添加微秒级延迟,避免数据库压力
  • 支持自定义批处理大小(100-10000范围)

2. 详细的预览功能

  • 按状态统计待删除记录
  • 按队列统计前10名
  • 显示最早记录时间
  • 提供清晰的数据概览

3. 完善的错误处理

  • 参数验证(天数>0,批处理大小在合理范围)
  • 数据库操作异常捕获和回滚
  • 详细的错误日志记录

4. 用户友好的交互

  • 进度条显示清理进度
  • 确认提示防止误操作
  • 强制模式支持自动化执行
  • 详细的操作日志

配置说明

默认配置

  • 保留天数: 5天
  • 执行频率: 每小时
  • 批处理大小: 1000条
  • 执行方式: 后台运行,防止重复执行

自定义配置

可以通过命令参数调整:

# 保留7天数据,每批500条
php artisan system:clean-job-runs --days=7 --batch-size=500

# 强制执行,不需要确认
php artisan system:clean-job-runs --force

# 仅预览,不实际删除
php artisan system:clean-job-runs --dry-run

性能影响

1. 数据库性能

  • 分批处理避免长时间锁表
  • 事务保护确保数据一致性
  • 批次间延迟减少数据库压力

2. 系统资源

  • 后台运行不影响前台服务
  • 内存使用可控(批处理限制)
  • CPU使用平稳(分批+延迟)

3. 清理效果

  • 定期清理保持表大小合理
  • 提升查询性能
  • 减少备份时间和存储空间

监控建议

1. 日志监控

  • 检查系统日志中的清理记录
  • 监控清理失败的异常日志
  • 跟踪清理数量和执行时间

2. 性能监控

  • 监控job_runs表大小变化
  • 观察清理前后的查询性能
  • 检查定时任务执行状态

3. 数据监控

  • 确认保留数据的完整性
  • 验证清理逻辑的正确性
  • 监控清理频率是否合适

总结

成功为System模块创建了完整的job_runs表清理功能:

  1. 功能完整: 支持预览、强制执行、分批处理等多种模式
  2. 安全可靠: 事务保护、参数验证、错误处理完善
  3. 自动化: 每小时自动执行,保持数据库性能
  4. 可配置: 支持自定义保留天数和批处理大小
  5. 用户友好: 详细的预览信息和进度显示

该功能将有效控制job_runs表的大小,提升系统整体性能。