6.0 KiB
6.0 KiB
统一任务调度器使用说明
概述
统一任务调度器(TaskSchedulerCommand)是一个集中管理所有定时任务的调度系统,支持:
- ✅ 单条 crontab 配置管理所有任务
- ✅ 多进程并发执行任务
- ✅ 自动根据 cron 表达式判断任务执行时间
- ✅ 任务锁机制,防止重复执行
- ✅ 完善的日志记录
安装配置
1. 配置文件
任务配置位于 config/task_scheduler.php,格式如下:
'任务标识' => [
'command' => '命令名称', // 必填:执行的命令
'schedule' => 'cron表达式', // 必填:cron表达式
'options' => ['--option=value'], // 可选:命令参数
'enabled' => true, // 可选:是否启用
'max_concurrent' => 1, // 可选:最大并发数
'timeout' => 3600, // 可选:超时时间(秒)
'log_file' => 'custom.log', // 可选:自定义日志文件
]
2. Cron 表达式格式
标准 cron 格式:分钟 小时 日 月 星期
示例:
*/1 * * * *- 每分钟执行*/5 * * * *- 每5分钟执行*/30 * * * *- 每30分钟执行0 2 * * *- 每天凌晨2点执行0 3 */3 * *- 每3天的3点执行
3. Crontab 配置
只需要在 crontab 中添加一条任务:
# 每分钟执行一次调度器(调度器内部会根据 cron 表达式判断哪些任务需要执行)
* * * * * cd /www/wwwroot/mckb_quwanzhi_com/Server && php think scheduler:run >> /www/wwwroot/mckb_quwanzhi_com/Server/runtime/log/scheduler.log 2>&1
4. 系统要求
- PHP >= 5.6.0
- 推荐启用
pcntl扩展以支持多进程并发(非必需,未启用时使用单进程顺序执行)
检查 pcntl 扩展:
php -m | grep pcntl
使用方法
手动执行调度器
# 执行调度器(会自动判断当前时间需要执行的任务)
php think scheduler:run
查看任务配置
# 查看所有已注册的命令
php think list
启用/禁用任务
编辑 config/task_scheduler.php,设置 'enabled' => false 即可禁用任务。
功能特性
1. 多进程并发执行
- 默认最大并发数:10 个进程
- 自动管理进程池
- 自动清理僵尸进程
2. 任务锁机制
- 每个任务在执行时会设置锁(5分钟内不重复执行)
- 防止任务重复执行
- 锁存储在缓存中,自动过期
3. 日志记录
- 调度器日志:
runtime/log/scheduler.log - 每个任务的日志:
runtime/log/{log_file} - 任务执行开始和结束都有标记
4. 超时控制
- 默认超时时间:3600 秒(1小时)
- 可在配置中为每个任务单独设置超时时间
- 超时后自动终止任务
配置示例
高频任务(每分钟)
'wechat_friends_active' => [
'command' => 'wechatFriends:list',
'schedule' => '*/1 * * * *',
'options' => ['--isDel=0'],
'enabled' => true,
],
中频任务(每5分钟)
'device_active' => [
'command' => 'device:list',
'schedule' => '*/5 * * * *',
'options' => ['--isDel=0'],
'enabled' => true,
],
每日任务
'wechat_calculate_score' => [
'command' => 'wechat:calculate-score',
'schedule' => '0 2 * * *', // 每天凌晨2点
'options' => [],
'enabled' => true,
],
定期任务(每3天)
'sync_all_friends' => [
'command' => 'sync:allFriends',
'schedule' => '0 3 */3 * *', // 每3天的3点
'options' => [],
'enabled' => true,
],
从旧配置迁移
旧配置(多条 crontab)
*/5 * * * * cd /path && php think device:list --isDel=0 >> log1.log 2>&1
*/1 * * * * cd /path && php think wechatFriends:list >> log2.log 2>&1
新配置(单条 crontab + 配置文件)
Crontab:
* * * * * cd /path && php think scheduler:run >> scheduler.log 2>&1
config/task_scheduler.php:
'device_active' => [
'command' => 'device:list',
'schedule' => '*/5 * * * *',
'options' => ['--isDel=0'],
'log_file' => 'log1.log',
],
'wechat_friends' => [
'command' => 'wechatFriends:list',
'schedule' => '*/1 * * * *',
'log_file' => 'log2.log',
],
监控和调试
查看调度器日志
tail -f runtime/log/scheduler.log
查看任务执行日志
tail -f runtime/log/crontab_device_active.log
检查任务是否在执行
# 查看进程
ps aux | grep "php think"
手动测试任务
# 直接执行某个任务
php think device:list --isDel=0
注意事项
- 时间同步:确保服务器时间准确,调度器依赖系统时间判断任务执行时间
- 资源限制:根据服务器性能调整
maxConcurrent参数 - 日志清理:定期清理日志文件,避免占用过多磁盘空间
- 任务冲突:如果任务执行时间较长,建议调整执行频率或增加并发数
- 缓存依赖:任务锁使用缓存,确保缓存服务正常运行
故障排查
任务未执行
- 检查任务是否启用:
'enabled' => true - 检查 cron 表达式是否正确
- 检查调度器是否正常运行:查看
scheduler.log - 检查任务锁:任务可能在5分钟内重复执行被跳过
任务执行失败
- 查看任务日志:
runtime/log/{log_file} - 检查命令是否正确:手动执行命令测试
- 检查权限:确保有执行权限和日志写入权限
多进程不工作
- 检查 pcntl 扩展:
php -m | grep pcntl - 检查系统限制:
ulimit -u查看最大进程数 - 查看调度器日志中的错误信息
性能优化建议
- 合理设置并发数:根据服务器 CPU 核心数和内存大小调整
- 错开高频任务:避免所有任务在同一分钟执行
- 优化任务执行时间:减少任务执行时长
- 使用队列:对于耗时任务,建议使用队列异步处理
更新日志
v1.0.0 (2024-01-XX)
- 初始版本
- 支持多进程并发执行
- 支持 cron 表达式调度
- 支持任务锁机制