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

本文探讨了在数据库查询需求大的场景下,如何利用协程和连接池提升效率。作者通过对比无协程、有协程及连接池的情况,展示了在资源充足的情况下,协程与连接池结合的优越性。文中提到了SMProxy作为连接池解决方案,并指出PHP的mysqli支持协程,但大多数框架使用PDO,为此提供了权衡建议。最后,作者分享了测试代码和实验结果,强调资源不足时应优先考虑SQL优化和负载均衡。
摘要由CSDN通过智能技术生成

最近因为做统计,有些部门需要一次性展示几十项数据,而每项数据是单独查询且都有可能跨多库,但查询的库均是从库,访问量不大,看了下服务端和数据库的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值