定时任务

开发者执行定时任务会通过Linux的Crontab去实现,不方便去管理。EasySwoole提供了根据LinuxCrontab规则的定时任务,最小粒度为1分钟。

创建一个定时任务

需要定义一个定时任务类继承EasySwoole\EasySwoole\Crontab\AbstractCronTask

定义执行规则

  1. public static function getRule(): string
  2. {
  3. // 定义执行规则 根据Crontab来定义
  4. return '*/1 * * * *';
  5. }

定义Crontab名称

  1. public static function getTaskName(): string
  2. {
  3. // 定时任务的名称
  4. return 'custom crontab';
  5. }

定义执行逻辑

  1. public function run(int $taskId, int $workerIndex)
  2. {
  3. // 定时任务的执行逻辑
  4. // 开发者可投递给task异步处理
  5. TaskManager::getInstance()->async(function (){
  6. // todo some thing
  7. });
  8. }

定义异常捕获

  1. public function onException(\Throwable $throwable, int $taskId, int $workerIndex)
  2. {
  3. // 捕获run方法内所抛出的异常
  4. }

注册Crontab

EasySwoole全局的mainServerCreate事件中进行进程注册

Crontab::getInstance()->addTask(CustomCrontab::class);

完整示例代码

  1. <?php
  2. namespace App\Crontab;
  3. use EasySwoole\EasySwoole\Crontab\AbstractCronTask;
  4. use EasySwoole\EasySwoole\Task\TaskManager;
  5. class CustomCrontab extends AbstractCronTask
  6. {
  7. public static function getRule(): string
  8. {
  9. // 定义执行规则 根据Crontab来定义
  10. return '*/1 * * * *';
  11. }
  12. public static function getTaskName(): string
  13. {
  14. // 定时任务的名称
  15. return 'CustomCrontab';
  16. }
  17. public function run(int $taskId, int $workerIndex)
  18. {
  19. // 定时任务的执行逻辑
  20. // 开发者可投递给task异步处理
  21. TaskManager::getInstance()->async(function (){
  22. // todo some thing
  23. });
  24. }
  25. public function onException(\Throwable $throwable, int $taskId, int $workerIndex)
  26. {
  27. // 捕获run方法内所抛出的异常
  28. }
  29. }

Crontab表达式

通用表达式:

  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)

特殊表达式:

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

Crontab管理

EasySwoole内置对于Crontab的命令行操作,方便开发者友好的去管理Crontab

可执行php easyswoole crontab -h来查看具体操作。

查看所有注册的Crontab

php easyswoole crontab show

停止指定的Crontab

php easyswoole crontab stop —name=TASK_NAME

恢复指定的Crontab

php easyswoole crontab resume —name=TASK_NAME

立即跑一次指定的Crontab

php easyswoole crontab run —name=TASK_NAME

版本强调

EasySwoole3.3.0如何定义:

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