mongdch / gaia-crontab
The Gaia Framework crontab process.
1.1.3
2026-11-07 03:53 UTC
Requires
- php: >=7.2.0
- mongdch/mon-env: ^1.1 || master-dev
- mongdch/mon-log: ^1.0 || master-dev
- mongdch/mon-util: ^1.5 || master-dev
- workerman/crontab: ^1.0
Requires (Dev)
None
Suggests
- mongdch/mon-think-orm: Required when using the Mysql task driver
Provides
None
Conflicts
None
Replaces
None
README
Gaia框架定时任务工具
特性
- 支持基于数组的
Job任务定义方式 - 支持基于
Think-ORM的Mysql任务定义方式 - 支持对象方法调用与
HTTP网络请求两类任务 - 支持
Redis业务锁,解决多实例部署下的任务并发执行问题 - 支持任务投递失败兜底记录与执行日志
安装
composer require mongdch/gaia-crontab
php gaia vendor:publish gaia\crontab
启动
php ./bin/crontab start
任务定义
Job驱动(配置数组方式)
任务在config/crontab/job.php中定义:
return [ [ // 任务名称 'title' => '测试对象方法任务', // 任务类型, 0执行对象方法 'type' => 0, // 定时执行规则 'rule' => '0/10 * * * * *', // 任务执行目标对象, 使用 @ 定义方法名,默认方法名 handler 'target' => \app\crontab\DemoTask::class, // 目标对象参数 'params' => [], // 是否单次执行 'singleton' => 0, // 是否有效 'status' => 1, ], ];
target为对象方法任务时,须位于class_prefix配置的命名空间白名单内(默认app\crontab\,见下文配置)target为HTTP任务时,请求参数支持在params中配置method、header、data、timeout、ua
Mysql驱动(数据库方式)
使用Mysql的任务定义驱动需自行初始化数据库,推荐使用mongdch/mon-think-orm
配置config/crontab/app.php中的driver为gaia\crontab\driver\Mysql::class后,执行数据库初始化指令建表:
php gaia crontab:dbinit
- 建表语句的表名自动读取
task_table/log_table配置,与任务驱动读写的表保持一致 - 已有旧表的需注意:日志表索引为
idx_crontab_id_create_time(crontab_id,create_time)复合索引,旧表可手动ALTER升级
生成任务处理器文件指令:
php gaia crontab:make-task Demo
配置说明
config/crontab/app.php主要配置项:
| 配置项 | 默认值 | 说明 |
|---|---|---|
driver |
Job::class |
任务驱动对象,支持Job/Mysql驱动 |
class_prefix |
app\crontab\ |
类方法任务对象命名空间白名单,空则不限制 |
class_timeout |
300 |
类方法任务执行超时时间(秒),0则不限制,仅在安装pcntl扩展的环境下生效 |
lock_prefix |
mon_crontab_ |
业务锁缓存前缀 |
lock_expire |
600 |
业务锁有效时间(秒) |
task_table |
crontab |
任务表表名(Mysql驱动) |
log_table |
crontab_log |
日志表表名(Mysql驱动) |
log_time_format |
Y-m-d H:i:s |
日志时间格式,空则为时间戳 |
variable |
- | 任务状态、类型、执行频率的值映射 |
process |
- | server/task进程配置,server进程强制单进程运行 |
运行保障机制
- 多实例并发控制:服务锁在任务加载时获取并定期续期,保证同一任务只会被一个实例加载;任务触发时再获取任务锁,保证同一时刻任务只被一个实例执行,投递结果返回或失败后释放
- 锁自愈:所有业务锁均携带
TTL自动过期,进程异常残留的锁无需人工清理;注意锁的清理由TTL完成,进程崩溃后重启需等待lock_expire时间内的锁自然过期 - 投递兜底:任务投递到异步处理进程失败时(连接失败、进程未响应等)记录错误日志并写入
crontab_log(status=0),任务不会静默丢失 - 执行日志:任务执行结果、耗时、状态记录于
crontab_log表(Mysql驱动)或日志通道(Job驱动) - 单次任务:
singleton为单次的任务执行完成后自动销毁定时器并禁用任务,不可重复加载
任务管理
通过support\crontab\CrontabService与服务进程通信:
use support\crontab\CrontabService; // 获取当前正在运行的任务 CrontabService::getPool(); // 重载指定任务(任务配置变更后调用) CrontabService::reload([1, 2]);
注意:Mysql驱动下删除任务后,需调用reload全量同步或重启服务进程才会从任务池移除。
日志清理
内置app\crontab\ClearLogTask示例任务,可配置定期清理一个月前的日志文件,按需在任务配置中启用。
开发测试
composer install vendor\bin\phpunit
测试套件覆盖配置变量获取器、Job驱动状态过滤与单次任务语义、任务管理器驱动校验与代理转发。
注意事项
- 类方法任务默认限制在
app\crontab\命名空间下,如需调用其他命名空间的类方法,请调整class_prefix配置(设为空则不限制,但请自行评估安全风险) - 任务
target与params来源于配置或数据库,请确保数据来源可信