**使用 think-swoole 的 Task 异步任务的步骤** 1. 定义事件监听类(php think make:listener 类名)。 2. app/event.php 文件中定义 swoole.task 的事件监听。 3. 获取到 Swoole/Server 对象调用 task 方法(参数中传递刚刚定义的监听类)。 4. 在刚刚定义的事件监听类的 handle 方法中定义触发回调逻辑代码。 5. 调用触发 task swoole.finish任务完成后的 finish 方法(需要才调用,非必须)。 **一、项目根目录创建短信发送事件:** 创建成功后,在app目录下会生成listener目录以及SmsTask.php,SmsTaskFinish.php ~~~ php think make:listener SmsTask php think make:listener SmsTaskFinish ~~~ ![](https://img.kancloud.cn/a9/a5/a9a526b8ebf3aac837feb6fa5f381eb3_571x188.png) **二、在app/event.php中定义短信发送事件:** ~~~ <?php // 事件定义文件 return [ 'bind' => [ ], 'listen' => [ 'AppInit' => [], 'HttpRun' => [], 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], 'swoole.task' => [ app\listener\SmsTask::class, ], 'swoole.finish' => [ app\listener\SmsTaskFinish::class, ], ], 'subscribe' => [ ], ]; ~~~ > 其中`swoole.task`这个键名是 Task 任务固定写法不能随意命名 > \[danger\] 其中`swoole.finish`这个键名是 Task 通知当前异步任务已经完成固定写法不能随意命名 **三、完善 SmsTask.php 的逻辑代码** ~~~ <?php declare (strict_types = 1); namespace app\listener; class SmsTask { /** * 事件监听处理 * * @return mixed */ public function handle($event) { var_dump($event->data);//event的data数据即server->task()传入的数据 echo "开始发送短信:".time().PHP_EOL; //模拟耗时 3 秒,测试是否在响应事件内 sleep(3); echo "短信发送成功:".time().PHP_EOL; // 可以调用 finish 方法通知其他事件类,通知当前异步任务已经完成了(非必须调用) // 参数 $event 是 Swoole\Server\Task 类的一个对象 可以调用 finish 方法触发 task 任务的 onFinish 事件 $event->finish($event->data); return; } } ~~~ **四、完善SmsTaskFinish.php 的逻辑代码** ~~~ <?php declare (strict_types = 1); namespace app\listener; class SmsTaskFinish { /** * 事件监听处理 * * @return mixed */ public function handle($event) { echo "finish"; //这里的第三个索引才是onTask传入的data数据 var_dump($event[2]); return; } } ~~~ **五、完善Register.php 的逻辑代码** ~~~ <?php // +---------------------------------------------------------------------- // | najing [ 通用后台管理系统 ] // +---------------------------------------------------------------------- // | Copyright (c) 2020 http://www.najingquan.com All rights reserved. // +---------------------------------------------------------------------- // | Author: 救火队队长 // +---------------------------------------------------------------------- namespace app\admin\controller; use app\BaseController; /** * 用户注册 * Class Register * @package app\admin\controller */ class Register extends BaseController { public function register() { //TODO 调用验证类验证数据 //TODO 将注册信息插入数据库 //异步模拟发送短信 $manager = app('\think\swoole\Manager'); $data = [ 'task' => 'sendSms', 'mobile' => '152****6268', ]; //传递参数 $manager->getServer()->task($data); return "注册成功!".time(); } } ~~~ 访问注册的方法,测试一下发送短信的时间是否计入用户注册方法内: ![](https://img.kancloud.cn/f8/69/f8690b9be36a553bcf68d6e9b589b6ce_680x157.png) 控制台打印信息: 开始发送短信:1590425425 短信发送成功:1590425428 finish 可见,短信发送的 3 秒钟是异步进行的,用户并无感知。