异步的任务队列

此特性依赖SwooleAsyncTask,必须先设置config/laravels.phpswoole.task_worker_num。异步任务的处理能力受Task进程数影响,需合理设置task_worker_num

1.创建任务类。

  1. use Hhxsv5\LaravelS\Swoole\Task\Task;
  2. class TestTask extends Task
  3. {
  4. private $data;
  5. private $result;
  6. public function __construct($data)
  7. {
  8. $this->data = $data;
  9. }
  10. // 处理任务的逻辑,运行在Task进程中,不能投递任务
  11. public function handle()
  12. {
  13. \Log::info(__CLASS__ . ':handle start', [$this->data]);
  14. sleep(2);// 模拟一些慢速的事件处理
  15. // 此处抛出的异常会被上层捕获并记录到Swoole日志,开发者需要手动try/catch
  16. $this->result = 'the result of ' . $this->data;
  17. }
  18. // 可选的,完成事件,任务处理完后的逻辑,运行在Worker进程中,可以投递任务
  19. public function finish()
  20. {
  21. \Log::info(__CLASS__ . ':finish start', [$this->result]);
  22. Task::deliver(new TestTask2('task2')); // 投递其他任务
  23. }
  24. }

2.投递任务。

  1. // 实例化TestTask并通过deliver投递,此操作是异步的,投递后立即返回,由Task进程继续处理TestTask中的handle逻辑
  2. use Hhxsv5\LaravelS\Swoole\Task\Task;
  3. $task = new TestTask('task data');
  4. // $task->delay(3); // 延迟3秒投递任务
  5. // $task->setTries(3); // 出现异常时,累计尝试3次
  6. $ret = Task::deliver($task);
  7. var_dump($ret);// 判断是否投递成功