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. }

任务定义 3.3.0版本后

  1. namespace App;
  2. use EasySwoole\EasySwoole\Crontab\AbstractCronTask;
  3. use EasySwoole\EasySwoole\Task\TaskManager;
  4. class TaskOne extends AbstractCronTask
  5. {
  6. public static function getRule(): string
  7. {
  8. return '*/1 * * * *';
  9. }
  10. public static function getTaskName(): string
  11. {
  12. return 'taskOne';
  13. }
  14. function run(int $taskId, int $workerIndex)
  15. {
  16. var_dump('c');
  17. TaskManager::getInstance()->async(function (){
  18. var_dump('r');
  19. });
  20. }
  21. function onException(\Throwable $throwable, int $taskId, int $workerIndex)
  22. {
  23. echo $throwable->getMessage();
  24. }
  25. }
  1. namespace App;
  2. use EasySwoole\EasySwoole\Crontab\AbstractCronTask;
  3. use EasySwoole\EasySwoole\Task\TaskManager;
  4. class TaskTwo extends AbstractCronTask
  5. {
  6. public static function getRule(): string
  7. {
  8. return '*/2 * * * *';
  9. }
  10. public static function getTaskName(): string
  11. {
  12. return 'taskTwo';
  13. }
  14. function run(int $taskId, int $workerIndex)
  15. {
  16. var_dump('c');
  17. TaskManager::getInstance()->async(function (){
  18. var_dump('r');
  19. });
  20. }
  21. function onException(\Throwable $throwable, int $taskId, int $workerIndex)
  22. {
  23. echo $throwable->getMessage();
  24. }
  25. }

任务定义 3.3.0版本前

  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 * * * *)