Swoft2 框架 Crontab 组件完全指南:从入门到高级应用,看这一篇就够了!
- 作者: 刘杰
- 来源: 技术那些事
- 阅读:247
- 发布: 2025-07-11 10:34
- 最后更新: 2025-07-11 10:34
定时器组件详细说明
注解
定时器包含两个注解@Scheduled 和 @Cron
-
@Scheduled这是一个类注解,只能放到类的注解中,接收一个
name参数,表示定时任务的名称。这个注解的作用主要是将绑定此注解的类,生成一个单例模式的 bean,名字为此类的类名;另一个就是将此类 bean 名称存储到静态变量中,将标志为@Scheduled的类,归为定时任务的实例,方便定时任务执行时候取用。 -
@Cron这是一个定时任务执行的配置注解,只能标注在定时任务类的需要定时执行的方法上。
-
value,只有一个value参数,用来收集定时任务的配置
-
配置定时任务
配置说明
定时任务支持到秒级,配置项对应意义分别为秒 分 时 日 月 周。
-
秒:有效数值区间为
0-59-
*表示每一秒都匹配(即范围内的任意值) -
18第 18 秒执行一次 -
0/5从第0秒开始,每5秒执行一次 -
1,3,5第 1、3、5 秒会执行任务 -
5-9从第 5 秒到第 9 秒会执行任务,每秒一次
-
-
分:有效区间为
0-59-
*表示任一分钟都匹配(0-59 内的任意一分钟) -
9表示第 9 分钟执行一次 -
0/3从第 0 分开始,每 3 分匹配有效(即 3、6、9...),需要配合其他配置共同匹配执行 -
1,3,5第 1、3、5 分有效匹配,需要配合其他配置共同匹配执行 -
8-30从第 8 分到第 30 分每分钟有效匹配,需要配合其他配置共同匹配执行
-
-
时:有效数值区间为
0-23配置分为形式同上(注意范围有区别)
-
日:有效数值区间为
1-31配置分为形式同上(注意范围有区别)
-
月:有效数值区间为
1-12配置分为形式同上(注意范围有区别)
-
周:有效数值区间为
0-6配置分为形式同上(注意范围有区别)
| 字段 | 允许值 | 允许的特殊字符 |
|---|---|---|
| 秒(Seconds) | 0~59的整数 | , - * / 四个字符 |
| 分(Minutes) | 0~59的整数 | , - * / 四个字符 |
| 小时(Hours) | 0~23的整数 | , - * / 四个字符 |
| 日期(DayofMonth) | 1~31的整数(但是你需要考虑你月的天数) | ,- * ? / 五个字符 |
| 月份(Month) | 1~12的整数 | , - * / 四个字符 |
| 星期(DayofWeek) | 0~6的整数(0=周日) | , - * ? / 五个字符 |
注意:
与服务器的 crontab 有区别的配置是,swoft2 的 cron 配置,不支持
*/5这种语法,而是用0/5代替与服务器的 crontab 有区别的配置是,swoft2 的 cron 配置,日期不支持 L / C/ W 这种语法
与服务器的 crontab 有区别的配置是,swoft2 的 cron 配置,星期不支持 L / C / # 这种语法
“?”字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值。当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
常用配置表达式示例
(0)0/20 * * * * ? 表示每20秒 调整任务
- 0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务
- 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
- 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
- 0 0 12 ? * 3 表示每个星期三中午12点 (此处 日 和 周之取一个,另一个用?表示)
- 0 0 12 * * ? 每天中午12点触发
- 0 15 10 ? * * 每天上午10:15触发
- 0 15 10 * * ? 每天上午10:15触发
- 0 15 10 * * ? * 每天上午10:15触发
- 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
- 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
- 0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
- 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
- 0 10,44 14 ? 3 3 每年三月的星期三的下午2:10和2:44触发
- 0 15 10 ? * 1-5 周一至周五的上午10:15触发
- 0 15 10 15 * ? 每月15日上午10:15触发
- 0 15 10 L * ? 每月最后一日的上午10:15触发
示例
php
/**
* Class CronTask
*
* @since 2.0
*
* @Scheduled()
*/
class CronTask
{
/**
* 此任务每天凌晨 1:20:00 执行
* @Cron("0 20 1 * * *")
*
* @throws Exception
*/
public function secondTask(): void
{
echo 'secondTask'. PHP_EOL;
}
/**
* 此任务每隔5秒执行一次
* @Cron("0/5 * * * * *")
* @return void
*/
public function test(): void
{
echo 'test'. PHP_EOL;
}
}
*/9不能用的原因是*/是多行注释的结束符,而swoft2 注解配置时,是在注释中的,这个字符表示注释结束,进而影响后续的代码产生语法问题。所以用0/9代替类似的语法。