• Crontab 定时器
    • 实现原理
    • 示例代码

    Crontab 定时器

    EasySwoole支持用户根据Crontab规则去添加定时器。时间最小粒度是1分钟。

    实现原理

    在主进程中,注册好各个任务规则和回调,服务启动后,在自定义进程内,通过定时器检测有没有待执行任务,若有则投递给异步进程异步执行。
    解析规则可以参考https://github.com/dragonmantank/cron-expression 实现。

    示例代码

    EasySwooleEvent.php中
    use EasySwoole\EasySwoole\Crontab\Crontab;

    1. public static function mainServerCreate(EventRegister $register)
    2. {
    3. // TODO: Implement mainServerCreate() method.
    4. /**
    5. * **************** Crontab任务计划 **********************
    6. */
    7. // 开始一个定时任务计划
    8. Crontab::getInstance()->addTask(TaskOne::class);
    9. // 开始一个定时任务计划
    10. Crontab::getInstance()->addTask(TaskTwo::class);
    11. }

    定时任务:TaskOne.php

    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: root
    5. * Date: 18-11-6
    6. * Time: 下午3:30
    7. */
    8. namespace App\Crontab;
    9. use EasySwoole\EasySwoole\Crontab\AbstractCronTask;
    10. class TaskOne extends AbstractCronTask
    11. {
    12. public static function getRule(): string
    13. {
    14. // TODO: Implement getRule() method.
    15. // 定时周期 (每小时)
    16. return '@hourly';
    17. }
    18. public static function getTaskName(): string
    19. {
    20. // TODO: Implement getTaskName() method.
    21. // 定时任务名称
    22. return 'taskOne';
    23. }
    24. static function run(\swoole_server $server, int $taskId, int $fromWorkerId,$flags=null)
    25. {
    26. // TODO: Implement run() method.
    27. // 定时任务处理逻辑
    28. var_dump('run once per hour');
    29. }
    30. }

    定时任务:TaskTwo.php

    1. <?php
    2. /**
    3. * Created by PhpStorm.
    4. * User: root
    5. * Date: 18-11-6
    6. * Time: 下午4:28
    7. */
    8. namespace App\Crontab;
    9. use EasySwoole\EasySwoole\Crontab\AbstractCronTask;
    10. class TaskTwo extends AbstractCronTask
    11. {
    12. public static function getRule(): string
    13. {
    14. // TODO: Implement getRule() method.
    15. // 定时周期 (每两分钟一次)
    16. return '*/2 * * * *';
    17. }
    18. public static function getTaskName(): string
    19. {
    20. // TODO: Implement getTaskName() method.
    21. // 定时任务名称
    22. return 'taskTwo';
    23. }
    24. static function run(\swoole_server $server, int $taskId, int $fromWorkerId,$flags=null)
    25. {
    26. // TODO: Implement run() method.
    27. // 定时任务处理逻辑
    28. var_dump('run once every two minutes');
    29. }
    30. }

    cron通用表达式规则如下:

    1. * * * * *
    2. - - - - -
    3. | | | | |
    4. | | | | |
    5. | | | | +----- day of week (0 - 7) (Sunday=0 or 7)
    6. | | | +---------- month (1 - 12)
    7. | | +--------------- day of month (1 - 31)
    8. | +-------------------- hour (0 - 23)
    9. +------------------------- min (0 - 59)

    cron特殊表达式有以下几个:

    1. @yearly 每年一次 等同于(0 0 1 1 *)
    2. @annually 每年一次 等同于(0 0 1 1 *)
    3. @monthly 每月一次 等同于(0 0 1 * *)
    4. @weekly 每周一次 等同于(0 0 * * 0)
    5. @daily 每日一次 等同于(0 0 * * *)
    6. @hourly 每小时一次 等同于(0 * * * *)