hyperf定时任务cron表达式支持5段标准格式(分、时、日、月、周)和6段秒级扩展格式(需启用enable_millisecond),字段顺序与取值范围必须严格匹配,空格须为英文半角且仅一个,周字段0/7均表示周日,与日字段同时非会触发逻辑冲突,时区需在crontab.php中显式配置timezone以避免utc偏差。

Hyperf 的定时任务 Cron 表达式遵循标准 Unix cron 格式,同时支持扩展的秒级精度(6段),书写必须严格匹配字段顺序和取值范围,否则任务不会触发或行为异常。
标准5段与秒级6段格式
Hyperf 默认使用 5 段格式(分、时、日、月、周),但开启 enable_millisecond => true 后可启用 6 段(秒、分、时、日、月、周):
-
5段示例:
"*/10 * * * *"→ 每10分钟执行一次(第0、10、20…分钟) -
6段示例:
"*/3 * * * * *"→ 每3秒执行一次(需配置中启用秒级支持) - 周字段支持
0–7,其中0和7均表示周日;推荐统一用0 - 字段支持通配符
*、步长/、区间-、枚举,,如"0,30 2-4 * * 1,3,5"
常见易错点与规范建议
很多任务“写对了却没跑”,往往源于细节偏差:
- 空格必须为英文半角,且段间仅一个空格;
"0 */2"(多空格)或"0*/2"(无空格)均无效 - 时间字段不支持中文符号、全角字符、制表符;复制表达式时注意清理隐藏格式
- 周与日字段**不建议同时设为非
*值**(如"0 0 1 * 1"),Hyperf 会按 cron 规范解释为“1号且周一”,多数情况不符合预期 - 开发环境建议用宽松规则快速验证,例如
"* * * * *"(每分钟)或"*/5 * * * *"(每5分钟)
本地快速测试表达式是否生效
无需等真实时间,可通过以下方式即时验证:
- 在任务
execute()方法开头加var_dump(date('Y-m-d H:i:s'));或日志输出,观察控制台是否按预期频率打印 - 启动服务后检查日志首行是否有
[INFO] Crontab manager started with X tasks,确认任务已被加载 - 临时将
$rule改为"* * * * *",等待1分钟看是否执行;成功后再换回原规则 - 使用在线工具辅助校验逻辑(注意:仅用于语义检查,不模拟 Hyperf 解析器):
• crontab.guru(支持5段,直观翻译)
• cronexpression.net(支持6段,可试算下次执行时间)
时区与配置联动要点
Cron 表达式始终按 config/autoload/crontab.php 中 timezone 配置的时间解析,而非服务器本地时区:
- 务必显式设置
'timezone' => 'Asia/Shanghai',避免因默认 UTC 导致任务延后8小时执行 - 修改时区后需重启服务,热重载不生效
- 若业务要求按用户所在地时间调度(如每日9点推送),需在任务内手动转换,Cron 层不支持动态时区











