Hyperf定时任务默认共享CrontabDispatcherProcess进程,但可通过四种方式实现逻辑隔离:1.用多ConsumerProcess处理异步队列任务;2.自定义多个CrontabDispatcherProcess扫描不同命名空间;3.封装为独立命令交由系统crontab调度;4.基于Swoole\Table+Timer自建轻量调度中心。

Hyperf 本身不为每个定时任务单独分配独立进程,它的 crontab 组件默认在主服务进程中由协程定时器统一调度,所有任务共享同一个 CrontabDispatcherProcess 进程。但若需实现“不同任务逻辑隔离运行、互不影响”,可通过以下几种方式达成实质上的“独立进程分配”效果。
1. 用不同 ConsumerProcess 分离任务类型
将耗时、高风险或需资源隔离的定时任务,改造成异步队列任务,并交由独立的消费者进程处理:
- 定义多个队列名(如
report_queue、cleanup_queue) - 在
config/autoload/processes.php中注册多个ConsumerProcess实例,分别指定不同队列和进程数 - 例如:
new ConsumerProcess(['queue' => 'report_queue', 'processes' => 2])和new ConsumerProcess(['queue' => 'cleanup_queue', 'processes' => 1]) - 定时任务类中只负责投递消息(
$this->queue->push(...)),不执行实际业务
2. 启用多个 CrontabDispatcherProcess 实例(需自定义)
官方仅提供一个 CrontabDispatcherProcess,但可复制并修改其实现,创建多个调度进程,各自扫描不同命名空间下的任务类:
- 新建
App\Process\ReportCrontabProcess和App\Process\CleanupCrontabProcess - 重写
handle()方法,分别扫描App\Crontab\Report\*和App\Crontab\Cleanup\* - 在
processes.php中同时注册两个自定义进程类 - 注意:需手动管理各进程间的时间错峰,避免同时触发高负载操作
3. 封装为独立命令 + 系统 crontab 隔离
对关键任务完全脱离 Hyperf 主进程调度,转为系统级进程控制:
- 用
gen:command创建专用命令类(如Report:Daily、Cleanup:Stale) - 每个命令对应一个完整生命周期的 PHP 进程,启动即执行、执行完即退出
- 在 Linux 的
/etc/crontab或crontab -e中为每个命令配置独立时间规则 - 优势是彻底进程隔离、OOM 不影响主服务;缺点是无法使用容器内服务(需显式初始化 DI 容器)
4. 基于 Swoole\Table + Timer 自建轻量调度中心
适合需要动态启停、按优先级分组、或严格控制并发的任务场景:
- 用
Swoole\Table存储任务元数据(名称、组别、规则、状态) - 启动多个
ServerProcess,每个绑定一个任务组(如group = 'high_priority') - 各进程只扫描自己组别的任务,触发时 fork 新进程或投递到专用协程池执行
- 可配合信号或 Redis Pub/Sub 实现跨进程任务启停通知


















