php 协程 mysql,原生php协程异步mysql方案-Go语言中文社区

最近因为做统计,有些部门需要一次性展示几十项数据,而每项数据是单独查询且都有可能跨多库,但查询的库均是从库,访问量不大,看了下服务端和数据库的cpu,内存峰值也不是很高,于是想着要不要用多线程+连接池的方式去执行。在经过一番权衡和试验后选择了协程与连接池的搭配,原因很简单,省事,好维护!哈哈~~~~

注意:此方案适用于数据库资源富余的情况,否则会出事的!!!对于资源不足的优化SQL,增加配置,负载均衡等等才是关键

因为本文主旨是提供思路,方案,此处不提供基础知识介绍,关于协程可以去了解下以下几点:

1. 操作系统调度算法---时间片轮算法

2.进程,线程与协程的区别

关于连接池的话随便搜一篇文章应该就能理解,理解所有的这些前提是你要知道你平时写的PHP  (指FPM,不是用FPM的同学就肯定不用看这句了  哈哈 )  是多进程模型的。

关于连接池,我当时是想用其他语言去写一个,但是在连接协议上处理比较麻烦,我想过用thrift调用(嫌麻烦,后续再研究),但这时候偏偏发现了一个很棒的项目SMProxy: https://github.com/louislivi/SMProxy   他们采用的就是mysql的协议,本身也带读写分离,这样对已有的项目就无须有太多的修改了。但是php的mysql客户端只有mysqli支持协程,平常各大框架使用的都是PDO,所以这中间可能需要权衡一下,具体可参考下向facebook学习,通过协程实现mysql查询的异步化。以下主要是一些测评演示,demo将上传至我的github上  https://github.com/wufantastic/php-async-linkpool-mysql ,欢迎各位star。

无协程:

mysql直连                                                                                     连接池

php 协程 mysql,原生php协程异步mysql方案-Go语言中文社区_第1张图片                               

php 协程 mysql,原生php协程异步mysql方案-Go语言中文社区_第2张图片

有协程:

mysql直连                                                                        连接池

php 协程 mysql,原生php协程异步mysql方案-Go语言中文社区_第3张图片         

php 协程 mysql,原生php协程异步mysql方案-Go语言中文社区_第4张图片

另外本次测试mysql协程查询是通过锁表,然后show full processlist来操作的

lock tables t1 write;

show full processlist;

做完实验记得unlock tables;

0ed9ccd08ffac87fd2cf7dac19b00a55.png

你可能感兴趣的:(php,协程,mysql)