thinkphp6 task异步
在Server程序中如果需要执行很耗时的操作,比如一个聊天服务器发送广播,Web服务器中发送邮件。如果直接去执行这些函数就会阻塞当前进程,导致服务器响应变慢。
模拟业务场景:使用form表单提交数据,完成注册并发送激活邮件的功能。
客户端提交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任务完成后的finish方法(需要才调用,非必须)
根据上面流程,完成一次实操:
进入tp61根目录运行:php think make:listener TaskTest
自动生成了app\listener\TaskTest事件监听类
在app/event.php中的数组listen
键中定义swoole.task事件的监听
之后编辑异步文件代码
之后在任意方法中调用task异步的事件 (三种方法都可以 任选)
//方法一
public function tasktest(){$swoole = app('swoole.server');$swoole -> task(\app\listener\TaskTest::class);echo "成功";
}
方法二
public function tasktest(\Swoole\Server $server){$server -> task(\app\listener\TaskTest::class);echo "成功";
}
方法三
public function tasktest(\think\swoole\Manager $manager){$manager->getServer() -> task(\app\listener\TaskTest::class);echo "成功";
}
thinkphp6 task异步相关推荐
- mysql异步task_EasySwoole高性能task异步任务
EasySwoole高性能task异步任务 羡仙. • 2019 年 06 月 20 日 和上一篇一样也是遗漏的重要文章,我太聪明了,这都能发现...他们都有共同的特征:笔记里的开头在上一篇...不管 ...
- RavenDb中的Task异步应用.Net4
internal partial class RavenService : ServiceBase { private RavenDbServer server; private Task sta ...
- C# Task异步编程
1.不适用异步的示例 using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...
- swoole task 异步任务 注释请忽略 自己加的不一定对 别误导大家。。。。。。
注释可以忽略不计 个人加的 可能会有错误 别误导大家... server端 <?php class Server {private $serv;public function __constru ...
- .NET 4.5 Task异步编程学习资料
参考资料: 1. http://www.cnblogs.com/heyuquan/archive/2013/04/18/3028044.html 转载于:https://www.cnblogs.com ...
- Task/Parallel实现异步多线程
代码: #region Task 异步多线程,Task是基于ThreadPool实现的{//TestClass testClass = new TestClass();//Action<obje ...
- tornado celery mysql_Python3.7+Tornado5+Celery3+Rabbitmq3实现异步队列任务
在之前的一篇文章中提到了用Django+Celery+Redis实现了异步任务队列,只不过消息中间件使用了redis,redis作为消息中间件可谓是差强人意,功能和性能上都不如Rabbitmq,所以本 ...
- 异步任务,邮箱任务,定时任务
task~ 异步任务 邮箱任务 定时任务 源码下载 异步任务 开启多线程,我飞了. package cn.bitqian.service;import org.springframework.sche ...
- IMI 基于 Swoole 开发的协程 PHP 开发框架 常驻内存、协程异步非阻塞
介绍 IMI 是基于 Swoole 开发的协程 PHP 开发框架,拥有常驻内存.协程异步非阻塞IO等优点. IMI 框架文档丰富,上手容易,致力于让开发者跟使用传统 MVC 框架一样顺手. IMI 框 ...
- python 多线程 异步_python 多线程异步
最近做了个爬取代理的爬虫,使用了python的aysncio及concurrent.futures的ThreadPoolExecutor(线程池)技术,最终完成了多线程下的异步抓取,在此mark下,以 ...
最新文章
- 【数学专题】约数个数与欧拉函数
- java绘等高线图_Matplotlib中的极坐标等高线图
- jvm性能调优 - 02JVM中内存区域
- idea连接mysql
- 使用Apache Isis快速进行SEMAT应用程序开发
- C#接口归纳总结实例详解
- Node 中的path模块
- 简单的反U盘病毒(删除不了的畸形文件夹)
- 【牛客网-公司真题-前端入门篇】——如何快速上手牛客
- mysql自学完整_MySQL自学篇(三)
- 社交电商“百花齐放”,光鲜背后是大战将起
- 打出一个平行四边形的C语言程序,用汇编语言编写一个平行四边形输出程序,图形如下...
- 【Kubernetes学习笔记】-kubeadm 手动搭建kubernetes 集群
- java项目前有红色叉号_eclipse导入项目后出现红色叉号的解决方案
- 教你如何做好微信客户管理?做到这3点,效率翻5倍
- 4个设计APP产品不得不知道的心理学原理
- LTE下行物理层传输机制(3)-PHICH信道
- 单片机光敏电阻控制蜂鸣器_光敏电阻控制蜂鸣器的开关,当值大于200时关,反之则开。...
- MySQL数据库的约束
- 清空mysql 表数据