Search by

mongdch / gaia-crontab

MonGDCH

The Gaia Framework crontab process.

Package info

github.com/MonGDCH/gaia-crontab

Homepage

pkg:composer/mongdch/gaia-crontab

Statistics

Installs: 83

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.1.3 2026-11-07 03:53 UTC

This package is auto-updated.

Last update: 2026-11-07 03:54:31 UTC


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来源于配置或数据库,请确保数据来源可信