Hyperf 中实现每月定时任务需使用 Crontab 组件配合 cron 表达式 '0 0 1 ',通过 @Crontab 注解标记任务类、配置 singleton=false 避免并发,并确保时区一致及多实例锁机制。

Hyperf 中实现每月定时执行任务,核心是通过 Task + Crontab 组件配合 cron 表达式完成,不依赖外部调度器,由 Hyperf 自带的协程定时器驱动。
配置 Crontab 任务支持
确保项目已安装并启用 hyperf/crontab 组件:
- 执行
composer require hyperf/crontab - 确认
config/autoload/dependencies.php中已自动注入CrontabManager - 检查
config/autoload/crontab.php是否存在(若无,可手动创建,内容为空数组即可)
编写每月执行的定时任务类
新建一个类(如 App\Task\MonthlyReportTask),实现 Hyperf\Crontab\Annotation\Crontab 注解:
- 使用
@Crontab注解标记,rule设为'0 0 1 * *'(每月 1 日 0 点 0 分触发) -
singleton=false避免多实例并发(默认为 true,适合无状态任务;若任务耗时长或需独占,可设为 false) -
memo字段建议填写说明,便于运维识别
示例代码:
namespace App\Task; <p>use Hyperf\Crontab\Annotation\Crontab;</p><h1>[Crontab(</h1><pre class="brush:php;toolbar:false;">name: "monthly-report", rule: "0 0 1 * *", singleton: false, memo: "每月1号凌晨生成运营报表"
)] class MonthlyReportTask { public function execute(): void { // 执行业务逻辑,如导出数据、发送汇总邮件等 \Hyperf\Utils\Coroutine::create(function () { // 协程安全地调用服务或 DB }); } }
启动与验证任务是否生效
任务类需被容器扫描到,确保 config/autoload/scan.php 包含对应命名空间:
- 检查
paths是否包含app/Task目录 - 运行
php bin/hyperf.php start启动服务后,查看日志中是否输出[INFO] Crontab "monthly-report" registered - 可通过
php bin/hyperf.php crontab:list查看已注册任务及其下次执行时间 - 如需调试,可临时将 rule 改为
'* * * * *'(每分钟执行),确认逻辑无误后再切回月度规则
注意事项与常见问题
实际部署中需注意以下几点:
- 服务器时区必须与
config/autoload/crontab.php中的timezone一致(默认为date_default_timezone_get(),建议显式设为'Asia/Shanghai') - 若使用 Docker 或多实例部署,多个 Worker 进程可能同时触发任务;可通过
lock机制(如 Redis 锁)保证仅一个节点执行 - 长期运行的任务建议设置超时控制和异常捕获,避免阻塞调度器
- Hyperf 的 Crontab 是基于主进程的协程定时器,不依赖系统 cron,因此无需在服务器上额外配置
crontab -e











