<p>Hyperf 中定时任务仅在周末运行需使用 cron 表达式“0 0 6,0”,其中 6 表示周六、0 表示周日,配合 @Cron 注解或 crontab.php 配置实现,并注意时区、日志验证及 Supervisor 进程启用。</p>

Hyperf 项目中,若希望定时任务(Cron)仅在周末(周六、周日)运行,需在 cron 表达式中精准控制执行时间。Hyperf 基于 Swoole 的协程调度器,其 Cron 组件支持标准 cron 语法,但要注意:Hyperf 的 Cron 注解或配置中的表达式,星期字段(第6位)默认使用 0–6(0=周日),与 Linux crontab 一致,这点必须确认。
周末执行的 Cron 表达式写法
要让任务只在周六、周日运行,推荐以下两种写法:
-
写法一(推荐):
0 0 * * 6,0—— 每周六、周日凌晨 0 点执行(6=周六,0=周日) -
写法二:
0 0 * * 6-0—— 部分环境支持范围写法,但兼容性略差,建议优先用逗号分隔
⚠️ 注意:不要写成 0 0 * * 7,0(7 不是标准值),也不要混淆为 1–7(Hyperf 默认 0=周日,1=周一…6=周六)。
在 Hyperf 中配置周末任务的两种方式
方式一:使用 @Cron 注解(推荐,简洁清晰)
#[Cron('0 0 * * 6,0')]
public function backupOnWeekend(): void
{
// 周末凌晨执行备份逻辑
}
方式二:在 config/autoload/crontab.php 中注册
return [
[
'name' => 'backup-weekend',
'type' => 'callback',
'rule' => '0 0 * * 6,0',
'callback' => [App\Task\BackupTask::class, 'execute'],
'singleton' => false,
],
];
验证与调试建议
开发阶段务必验证表达式是否生效:
- 启动项目后执行
php bin/hyperf.php cron:list,确认任务已注册且规则正确 - 临时改用
* * * * 6,0(每分钟触发)测试逻辑,确认任务能正常执行后再切回生产表达式 - 检查日志(
runtime/logs/crontab.log)是否有调度记录和异常 - 注意时区:确保
date_default_timezone_set()或config/autoload/constants.php中设置的时区与业务预期一致(如'Asia/Shanghai')
常见陷阱提醒
容易出错的几个点:
- Hyperf 默认使用
0=周日,若项目启用了自定义weekStartDay(极少见),需查阅对应版本文档 - 任务类未加
#[Inject]或未声明为Singleton时,若含依赖注入,可能因容器初始化失败而静默跳过 - 生产环境若用 Supervisor 管理进程,请确认
cron进程已启用(php bin/hyperf.php start启动时需包含--with-cron或配置项开启)


















