Swoole+Lumen:同步编程风格调用MySQL异步查询
lumen-swoole-http正是连接同步编程Lumen和异步编程Swoole的一座桥梁,有兴趣可以关注一下。
LNMP的不足
LNMP是经典的Web应用架构组合,虽然(Linux、NginX、MySQL和PHP-FPM)四者各种是优秀的系统或软件,但是组合到一起的总体性能并不尽人意,明显的不是1+1+1+1>4
,而是4+3+2+1<1
。Linux系统无可厚非,主要问题出现在:
从NginX到PHP-FPM
NginX利用IO多路复用机制epoll,极大地减少了IO阻塞等待,可以轻松应对C10K。可是每次NginX将用户请求传递给PHP-FPM时,PHP-FPM总是需要从新加载PHP项目代码:创建执行环境,读取PHP文件和代码解析、编译等操作一次又一次的重复执行,造成不小的消耗。
从PHP-FPM到MySQL
由于PHP代码本身是同步执行,PHP-FPM连接MySQL查询数据时,只能空闲等待MySQL返回查询结果。一个查询语句执行时间可能会需要几秒钟,期间PHP-FPM若是能暂时放下当前用户慢查询请求,而去处理其他用户请求,效率必然有所提高。
<!--more-->
Swoole HTTP服务器
Swoole HTTP服务器也采用了epoll机制,运行性能与NginX相比,虽不及,犹未远。不过Swoole HTTP服务器嵌入PHP中作为其一部分,可以直接运行PHP,完全可以取代NginX + PHP-FPM组合。
以目前流行的为框架Lumen(Laravel的子框架)为例,用Swoole HTTP服务器运行Lumen项目十分简单,只需要在$worker->onRequest($request, $response)
(收到用户请求)时将$request
传给Lumen处理,$response
再将Lumen的处理结果返回给用户,而且$worker
的整个生命周期里只会加载一次Lumen项目代码,没有多余的磁盘IO和PHP代码编译的开销。
压力测试
在4GB+4Core的虚拟机下,测试HTTP服务器的静态输出:
- 2000客户端并发500000请求,不开启HTTP Keepalive,平均QPS:
NginX + HTML QPS:25883.44 NginX + PHP-FPM + Lumen QPS:828.36 Swoole + Lumen QPS:13647.75
- 2000客户端并发500000请求,开启HTTP Keepalive,平均QPS:
NginX + HTML QPS:86843.11 NginX + PHP-FPM + Lumen QPS:894.06 Swoole + Lumen QPS:18183.43
可以看出,Swoole + Lumen
组合的执行效率远高于NginX + PHP-FPM + Lumen
组合。
异步MySQL客户端
以上都是铺垫,以下才是整篇文章的重点相关推荐
lumen是laravel的简化版,其中artisan部分删除了大部分的command,无法按laravel方式创建自定义的artisan命令。必须在里面声明命令$signature和handle方法