hyperf定时任务需注册crontabdispatcherprocess进程并启用crontab.php的enable开关,配置时区与扫描路径,注解或配置文件方式注册任务,首次执行等待下一个匹配时间点。

Hyperf 初始化定时任务进程,核心是启动一个独立的 CrontabDispatcherProcess 自定义进程,它不依赖系统 crond,而是由框架在服务启动时自动拉起,负责按规则扫描、分发和执行所有已注册的定时任务。配置本身不复杂,但几个关键点必须对齐,否则任务不会触发。
启用调度器进程(必须注册)
Hyperf 的定时任务不是靠 Worker 进程承载,而是通过单独的进程驱动。需在 config/autoload/processes.php 中显式注册:
- 写法为:
HyperfCrontabProcessCrontabDispatcherProcess::class - 不能只写类名字符串,必须是完整类引用
- 该进程启动后持续运行,不随 Worker 重启,也不受
max_request影响
开启全局开关与基础配置
仅注册进程还不够,还需激活功能并设定基础行为:
- 确保
config/autoload/crontab.php存在且'enable' => true - 可选配
'timezone' => 'Asia/Shanghai',避免 cron 表达式因时区偏差错判执行时间 -
'scan' => ['AppCrontab']可指定注解扫描路径,默认为AppTask,若自定义目录需同步调整
任务注册方式决定加载时机
任务是否被识别,取决于注册方式与类加载时机:
- 注解方式(
@Crontab):类需位于扫描路径内,且类文件被自动加载(如命名空间匹配、Composer autoload 规则覆盖) - 配置文件方式:直接在
crontab.php的'crontab'数组中 new Crontab 实例,无需额外类加载 - 两种方式互斥不冲突,可混合使用,但同名
name会以最后加载的为准
启动后行为与常见误区
服务启动后,调度器进程立即就绪,但执行有隐含规则:
- 首次执行不会“立刻触发”,而是等待下一个匹配时间点 —— 例如 rule 是
* * * * *,启动时刻是 10:05:03,则第一次执行在 10:06:00 - 秒级规则(6 位 cron)如
*/5 * * * * *必须转义斜杠,实际写为*\/5 * * * * * - 若任务未执行,优先检查进程是否真在运行:
ps aux | grep crontab,而非只看日志











