Think-Swoole之Task 异步任务
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Think-Swoole之Task 异步任务,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3368字,纯文字阅读大概需要5分钟。
内容图文
![Think-Swoole之Task 异步任务](/upload/InfoBanner/zyjiaocheng/276/a8ef407cdfc346a4b87df094a72085c5.jpg)
![Think-Swoole之Task 异步任务 - 文章图片](/upload/getfiles/0001/2021/4/22/20210422032404316.jpg)
使用场景
在 Server 程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。例如:用户注册场景,完成注册并发送激活邮件的功能,需要以下几步:
客户端提交 POST 数据 -> 服务器获取到数据 -> 完成注册将用户数据写入数据库 -> 发送账号激活邮件 -> 返回客户端提示注册成功。
这个业务逻辑是没有问题的,但是由于发送邮件是一个耗时操作(比如2-3s)并且会同步阻塞程序的执行,直到发送成功以后响应到客户端提示注册成功。这个过程中用户从提交到最后得到注册成功的提示估计需要4s左右,一次请求响应需要4s这肯定是不合理的!
现在使用 Task 异步任务投递可以大大提升用户体验,大致流程:
客户端提交 POST 数据 -> 服务器获取到数据 -> 完成注册将用户数据写入数据库 -> 马上返回客户端提示注册成功。
在注册成功同时投递一个 Task 任务 -> 异步完成邮件发送的耗时操作 (这部分时间用户是无感知的,因为很早已经响应回客户端了)。
如何使用 Think-Swoole 的 Task 异步任务的步骤
定义事件监听类(php think make:listener 类名)。
app/event.php 文件中定义 swoole.task 的事件监听。
获取到 Swoole/Server 对象调用 task 方法(参数中传递刚刚定义的监听类)。
在刚刚定义的事件监听类的 handle 方法中定义触发回调逻辑代码。
调用触发 task swoole.finish任务完成后的 finish 方法(需要才调用,非必须)。
进行演示
首先,项目根目录创建邮件发送事件:
php think make:listener EmailTask
然后定义创建的邮件发送事件:
app/event.php 'listen' => [ 'AppInit' => [], 'HttpRun' => [], 'HttpEnd' => [], 'LogLevel' => [], 'LogWrite' => [], 'swoole.task' => [ app\listener\EmailTask::class, ], // 'swoole.finish' => [ // app\listener\EmailTaskFinish::class, // ], ],
其中 swoole.task 这个键名是 Task 任务固定写法不能随意命名。
接着,我们在负责用户注册的控制器内,通过 Swoole/Server 类来调用 Task 异步任务,当然,我们要先完善 EmailTask.php 的逻辑代码:
app/listener/EmailTask.php
<?php declare (strict_types = 1); namespace app\listener; class EmailTask { /** * 事件监听处理 * * @return mixed */ public function handle($event) { echo "开始发送邮件:".time(); //模拟耗时 3 秒,测试是否在响应事件内 sleep(3); echo "邮件发送成功:".time(); // 可以调用 finish 方法通知其他事件类,通知当前异步任务已经完成了(非必须调用) // 参数 $event 是 Swoole\Server\Task 类的一个对象 可以调用 finish 方法触发 task 任务的 onFinish 事件 // $event -> finish(\app\listener\EmailTaskFinish::class); } }
注册方法 app/controller/Register.php
<?php namespace app\controller; use app\BaseController; class Register extends BaseController { public function register(\Swoole\Server $server) { if($this -> request -> isPost()){ $data = $this -> request -> post(); //TODO 调用验证类验证数据 //TODO 将注册信息插入数据库 // 这里调用 Task 异步任务 $server -> task(\app\listener\EmailTask::class); // 方式二 // $manager = app('\think\swoole\Manager'); // $manager -> getServer() -> task(\app\listener\EmailTask::class); return "注册成功!".time(); } } }
注册业务中,插入数据库后,调用了发送邮件异步任务,在 EmailTask.php 模拟发送邮件需要 3 秒钟。
开启 Think-Swoole 服务,访问注册的方法,测试一下发送邮件的时间是否计入用户注册方法内:
可见,邮件发送的 3 秒钟是异步进行的,用户并无感知。
另外,还有个 swoole.finish 事件,用来通知其他事件当前异步任务已经完成了,同样需要创建事件,在 app/event.php 中定义 swoole.finish,上述示例代码已经演示了。
以上就是Think-Swoole之Task 异步任务的详细内容。
本文系统来源:https://www.php.cn/phpkj/thinkphp/462067.html内容总结
以上是互联网集市为您收集整理的Think-Swoole之Task 异步任务全部内容,希望文章能够帮你解决Think-Swoole之Task 异步任务所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。