重庆分公司,新征程启航

为企业提供网站建设、域名注册、服务器等服务

如何使用Think-Swoole的Task异步任务

小编给大家分享一下如何使用Think-Swoole的Task异步任务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

为企业提供网站设计、成都做网站、网站优化、营销型网站、竞价托管、品牌运营等营销获客服务。创新互联建站拥有网络营销运营团队,以丰富的互联网营销经验助力企业精准获客,真正落地解决中小企业营销获客难题,做到“让获客更简单”。自创立至今,成功用技术实力解决了企业“网站建设、网络品牌塑造、网络营销”三大难题,同时降低了营销成本,提高了有效客户转化率,获得了众多企业客户的高度认可!

使用场景

在 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

 finish(\app\listener\EmailTaskFinish::class);
    }
}

注册方法 app/controller/Register.php

 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 服务,访问注册的方法,测试一下发送邮件的时间是否计入用户注册方法内:

如何使用Think-Swoole的Task异步任务

可见,邮件发送的 3 秒钟是异步进行的,用户并无感知。

另外,还有个 swoole.finish 事件,用来通知其他事件当前异步任务已经完成了,同样需要创建事件,在 app/event.php 中定义 swoole.finish,上述示例代码已经演示了。

以上是“如何使用Think-Swoole的Task异步任务”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


网页题目:如何使用Think-Swoole的Task异步任务
分享链接:http://cqcxhl.cn/article/gcijje.html

其他资讯

在线咨询
服务热线
服务热线:028-86922220
TOP