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直连                                                                                     连接池

897b4d65e4254a37b9e3463883a3bd4b.png                               

714cb616f95d23b6aeed976f5694939a.png

有协程:

mysql直连                                                                        连接池

114d123746635bd8d19396a4a19414d1.png         

d2df600e6b897d8e4ad34a3672519bd7.png

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

lock tables t1 write;

show full processlist;

做完实验记得unlock tables;

0ed9ccd08ffac87fd2cf7dac19b00a55.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值