上一篇文章介绍了利用yield特性实现后置的MySQL异步查询协程,按照这种“后置执行”的思路,其实还可以实现更多其他的后置异步协程。这里介绍如何自定义一个后置异步协程,将最大开发自由度交由Lumen框架使用者。
CustomAsyncProcess
lumen-swoole-http中已经定义了抽象类CustomAsyncProcess
,在处理用户请求时,若是捕获到CustomAsyncProcess
类的对象,程序便会按照CustomAsyncProcess
对象的指定方法执行。部分代码:
1 |
|
一个简单的后置协程
我们先来实现一个简单的后置协程EasyProcess
,继承自CustomAsyncProcess
,需要实现两个抽象方法:
1 |
|
然后就可以在Controller中使用这个后置协程:
1 |
|
当访问TestController@test
对应的路由时,得到的返回结果有可能是1,也有可能是2,视当时协程数量而定。1或2这个结果在TestController@test
层面上是未曾知的,是由EasyProcess
这个后置协程产出的。
EasyProcess
不算一个异步协程,无论runNormalTask
方法或者runAsyncTask
方法,都是同步执行的。若想实现异步执行,必须使用Swoole提供的异步客户端,详细请查看Swoole官方文档AsyncIO。
下面介绍如何实现一个后置的异步HTTP客户端协程。
一个后置的异步HTTP客户端协程
假设我们处理某个用户请求时,需要从远端链接http://www.domain.com/api/data
获取一些数据,期间可能需要耗时几秒钟,那么怎样用后置异步协程实现来避免阻塞呢?
我们先来实现一个简单的后置协程AysncHttpProcess
,继承自CustomAsyncProcess
,需要实现两个抽象方法:
1 |
|
然后就可以在Controller中使用这个后置协程:
1 |
|
就这样,在协程数量允许情况下,我们可以使用后置的异步HTTP客户端协程获取远端数据,并且避免了阻塞。
最后
三篇文章:
至此,已经将lumen-swoole-http的设计理念介绍完了,主要是两点:
- 利用Swoole HTTP服务器运行Lumen项目,提高执行效率;
- 利用后置异步协程,保持同步编程风格,避免主进程阻塞。
Swoole填补了PHP网络编程的缺陷,引入NodeJS、GoLang等语言的并行执行特性,使用了不同的编程风格。对此,不应该一味抗拒,而是学会融会贯通——学无止境,知识没有界限,PHPer也应该学习其他语言的设计理念,特别是为高并发而生的GoLang。