Swoft2 框架 Crontab 组件完全指南:从入门到高级应用,看这一篇就够了!

定时器组件详细说明

注解

定时器包含两个注解@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秒 调整任务

  1. 0 0 2 1 * ? 表示在每月的1日的凌晨2点调整任务
  2. 0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
  3. 0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
  4. 0 0 12 ? * 3 表示每个星期三中午12点 (此处 日 和 周之取一个,另一个用?表示)
  5. 0 0 12 * * ? 每天中午12点触发
  6. 0 15 10 ? * * 每天上午10:15触发
  7. 0 15 10 * * ? 每天上午10:15触发
  8. 0 15 10 * * ? * 每天上午10:15触发
  9. 0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
  10. 0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
  11. 0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
  12. 0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
  13. 0 10,44 14 ? 3 3 每年三月的星期三的下午2:10和2:44触发
  14. 0 15 10 ? * 1-5 周一至周五的上午10:15触发
  15. 0 15 10 15 * ? 每月15日上午10:15触发
  16. 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代替类似的语法。