一直以来,php一直没有mysql连接池的概念,而在开发中大多数框架也是直接使用了长连接的方式。如Thinkphp就是使用的长连接。对于并发较小的项目来说,长连接确实可以提高查询效率,php不用每次去与mysql服务器建立连接,只要某个php-cgi连接过mysql,那么本次访问结束后,php不会释放与mysql的连接。当下次请求过来的时候,php就可以复用之前的连接,从而消除了建立连接是的额外损耗。
举个栗子:
假如有一台mysql服务器MA允许的最大连接数为50。有一台php-fpm服务器PA,PA常驻的php-cgi进程数量设置为100。
- 当并发量查询访问小于50的时候,php使用长连接不会有问题。
- 当并发量查询大于50的时候,再使用长连接就会出现mysql连接数量不足。如果有60的并发查询访问,那么就会有10请求无法与mysql建立连接。(这里不考虑mysql设置连接等待队列back_log)
解决上面场景问题的思路如下:
1、增加mysql的最大连接数
这种方法增加的数量有限,当超过某个数量时,查询效率与建立连接的效率都会大大折扣。具体与mysql服务器的硬件配置高低有关。
2、使用缓存技术,让查询不会直接冲击到db;
使用redis、memcached做缓存层,减少与mysql的连接频率
3、使用mysql中间件
mycat(国内开源软件)、SMProxy(一款基于swoole的轻量连接池)
4、使用主从数据库
读写分离。可部署多台slave服务器。服务器数量越多也就意味着你可建立的最大连接越多。
步入正题,搭建SMProxy连接池
必须安装php并且安装swoole扩展并把php添加到环境变量中。
1、下载SMProxy
2、修改SMProxy配置
SMProxy conf目录有两个配置文件,一个是database.json,用于配置mysql数据库信息。另一个是server.json用于配置连接池的一些信息
- database.json
- server.json
3、启动SMProxy
4、框架测试
我这里使用的是thinkphp5进行的测试
- 修改databse.php的配置为SMProxy的server.json设置的信息
- 测试查询
查询结果如下:
本文地址:http://lianchengexpo.xrbh.cn/quote/6839.html 迅博思语资讯 http://lianchengexpo.xrbh.cn/ , 查看更多