异步的任务队列
此特性依赖
Swoole
的AsyncTask
,必须先设置config/laravels.php
的swoole.task_worker_num
。异步任务的处理能力受Task进程数影响,需合理设置task_worker_num。
1.创建任务类。
- use Hhxsv5\LaravelS\Swoole\Task\Task;
- class TestTask extends Task
- {
- private $data;
- private $result;
- public function __construct($data)
- {
- $this->data = $data;
- }
- // 处理任务的逻辑,运行在Task进程中,不能投递任务
- public function handle()
- {
- \Log::info(__CLASS__ . ':handle start', [$this->data]);
- sleep(2);// 模拟一些慢速的事件处理
- // throw new \Exception('an exception');// handle时抛出的异常上层会忽略,并记录到Swoole日志,需要开发者try/catch捕获处理
- $this->result = 'the result of ' . $this->data;
- }
- // 可选的,完成事件,任务处理完后的逻辑,运行在Worker进程中,可以投递任务
- public function finish()
- {
- \Log::info(__CLASS__ . ':finish start', [$this->result]);
- Task::deliver(new TestTask2('task2')); // 投递其他任务
- }
- }
2.投递任务。
- // 实例化TestTask并通过deliver投递,此操作是异步的,投递后立即返回,由Task进程继续处理TestTask中的handle逻辑
- use Hhxsv5\LaravelS\Swoole\Task\Task;
- $task = new TestTask('task data');
- // $task->delay(3);// 延迟3秒投放任务
- $ret = Task::deliver($task);
- var_dump($ret);//判断是否投递成功