一直以来,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
git clone https://github.com/louislivi/SMProxy.git
# 或者直接下载源码包解压
https://github.com/louislivi/SMProxy/releases/latest
2、修改SMProxy配置

SMProxy conf目录有两个配置文件,一个是database.json,用于配置mysql数据库信息。另一个是server.json用于配置连接池的一些信息

  • database.json
{"database": {# 设置mysql账户信息"account": {"master_test": {"user": "root","password": "root123456"}},# 设置数据库host、端口等信息"serverInfo": {"server1": {"write": {"host": ["172.18.0.4"],"port": 3306,"timeout": 2,"account": "master_test"}}},# 设置database的名称"databases": {"test": {"serverInfo": "server1","startConns": "swoole_cpu_num()*2","maxSpareConns": "swoole_cpu_num()*2","maxSpareExp": 3600,"maxConns": "swoole_cpu_num()*2","charset": "utf8mb4"}}}
}
  • server.json
{# 设置代理地址端口、账户密码"server": {"user": "sm_proxy","password": "123456","charset": "utf8mb4","host": "172.18.0.8","port": "3366","mode": "SWOOLE_PROCESS","sock_type": "SWOOLE_SOCK_TCP","logs": {"open":true,"config": {"system": {"log_path": "ROOT/logs","log_file": "system.log","format": "Y/m/d"},"mysql": {"log_path": "ROOT/logs","log_file": "mysql.log","format": "Y/m/d"}}},"swoole": {"worker_num": "swoole_cpu_num()","max_coro_num": 6000,"open_tcp_nodelay": true,"daemonize": true,"heartbeat_check_interval": 60,"heartbeat_idle_time": 600,"reload_async": true,"log_file": "ROOT/logs/swoole.log","pid_file": "ROOT/logs/pid/server.pid"},"swoole_client_setting": {"package_max_length": 16777215},"swoole_client_sock_setting": {"sock_type": "SWOOLE_SOCK_TCP"}}
}
3、启动SMProxy
[root@35c65981765f /]# SMProxy start
[root@35c65981765f /]# ps -ef|grep SMProxy
root        12     1  0 06:29 ?        00:00:00 SMProxy master  process
root        14    12  0 06:29 ?        00:00:00 SMProxy manager process
root        28    14  0 06:29 ?        00:00:00 SMProxy worker-0  process
root        46    30  0 06:31 pts/1    00:00:00 grep --color=auto SMProxy
4、框架测试

我这里使用的是thinkphp5进行的测试

  • 修改databse.php的配置为SMProxy的server.json设置的信息
return [// 数据库类型'type'            => 'mysql',// 服务器地址'hostname'        => '172.18.0.8',// 数据库名'database'        => 'test',// 用户名'username'        => 'sm_proxy',// 密码'password'        => '123456',// 端口'hostport'        => '3366',// 连接dsn'dsn'             => '',// 数据库连接参数'params'          => [\PDO::ATTR_CASE => \PDO::CASE_NATURAL,\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,\PDO::ATTR_ORACLE_NULLS => \PDO::NULL_NATURAL,\PDO::ATTR_STRINGIFY_FETCHES => false,\PDO::ATTR_EMULATE_PREPARES => true,],// 数据库编码默认采用utf8'charset'         => 'utf8',// 数据库表前缀'prefix'          => 'think_',// 数据库调试模式'debug'           => true,// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)'deploy'          => 0,// 数据库读写是否分离 主从式有效'rw_separate'     => false,// 读写分离后 主服务器数量'master_num'      => 1,// 指定从服务器序号'slave_no'        => '',// 自动读取主库数据'read_master'     => false,// 是否严格检查字段是否存在'fields_strict'   => true,// 数据集返回类型'resultset_type'  => 'array',// 自动写入时间戳字段'auto_timestamp'  => false,// 时间字段取出后的默认时间格式'datetime_format' => 'Y-m-d H:i:s',// 是否需要进行SQL性能分析'sql_explain'     => true,
];
  • 测试查询
<?php
/*** +----------------------------------------------------------------------* |Created by PhpStorm.* +----------------------------------------------------------------------* |User: gongxulei <email:790707988@qq.com>* +----------------------------------------------------------------------* |Date: 2020/6/6* +----------------------------------------------------------------------* |Time: 5:43 下午* +----------------------------------------------------------------------*/namespace app\index\controller;use think\Controller;
use think\Db;class Test extends Controller
{/*** SMProxy查询测试* @access public* @param mixed $field 字段描述* @return mixed**/public function smProxyAction(){$res = Db::table('lock1')->field('*')->select();return json($res);}}

查询结果如下:

[{"id": "1","name": "1","create_time": null},{"id": "2","name": "cc","create_time": null},{"id": "3","name": "cc","create_time": null},{"id": "4","name": "cc","create_time": null}
]

官方文档地址如下:
https://smproxy.gitee.louislivi.com/#/README

php搭建mysql连接池相关推荐

  1. mysql多个字符串连接池_使用Coroutine\Channel实现一个简单的MySQL连接池

    Channel通道,类似于go语言的chan,支持多生产者协程和多消费者协程,Swoole底层自动实现了协程的切换和调度 Channel实现原理 通道与PHP的Array类似,仅占用内存,没有其他额外 ...

  2. mysql内连接和外连接的区别_Swoole4创建Mysql连接池

    一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...

  3. MySQL会回收使用中的连接吗_Node.js实现mysql连接池使用事务自动回收连接的方法示例...

    本文实例讲述了Node.js实现mysql连接池使用事务自动回收连接的方法.分享给大家供大家参考,具体如下: var mysql = require('mysql'), Connection = re ...

  4. mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别

    1. MySQL连接池 连接池通常实现在client端,是指应用(客户端)预先创建一定的连接,利用这些连接服务于客户端所有的DB请求.如果某一个时刻,空闲的连接数小于DB的请求数,则需要将请求排队,等 ...

  5. php 协程 mysql_实现一个协程版mysql连接池

    实现一个协程版的mysql连接池,该连接池支持自动创建最小连接数,自动检测mysql健康:基于swoole的chanel. 最近事情忙,心态也有点不积极.技术倒是没有落下,只是越来越不想写博客了.想到 ...

  6. node mysql limit_node中mysql连接池的connectionLimit指什么,它和mysql的最小连接数和最大连接数的关系是什么?...

    问题1:node中mysql连接池的connectionLimit指什么,它和mysql的最小连接数和最大连接数的关系是什么 问题2:mysql max_connections是什么,max_used ...

  7. swoole原生mysql进程池_swoole的mysql连接池怎么弄

    swoole的mysql连接池怎么弄 发布时间:2020-12-28 09:54:07 来源:亿速云 阅读:68 作者:小新 这篇文章给大家分享的是有关swoole的mysql连接池怎么弄的内容.小编 ...

  8. node mysql 连接池创建_Node.js使用MySQL连接池的方法实例

    本文实例讲述了Node.js使用MysqL连接池的方法.分享给大家供大家参考,具体如下: Nodejs如何使用MysqL Nodejs要连接MysqL,可以使用Nodejs的MysqL驱动来实现.比如 ...

  9. 关于Tomcat与MySQL连接池问题的详解

    转载自   关于Tomcat与MySQL连接池问题的详解 研究了一天,终于有所收获,希望对大家有所帮助.首先请大家注意:这里尤其讨论Tomcat5.5版本中遇到的问题,为什么尤其单对这个版本,我一会儿 ...

  10. easyswoole数据库连接池_如何在 Swoole 中优雅的实现 MySQL 连接池

    如何在 Swoole 中优雅的实现 MySQL 连接池 一.为什么需要连接池 ? 数据库连接池指的是程序和数据库之间保持一定数量的连接不断开, 并且各个请求的连接可以相互复用, 减少重复连接数据库带来 ...

最新文章

  1. 「SVN」Linux下svn使用命令
  2. 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...
  3. 软件工程作业 - word count
  4. return 、break 和 continue的区别
  5. Android基础View回顾
  6. checkbox选中与取消选择
  7. 【优化求解】基于matlab模拟退火算法求解函数极值问题【含Matlab源码 1203期】
  8. 华为数通HCNA学习资料
  9. 如何下载谷歌地球高程为TIF格式的文件
  10. Android开启OTG功能/USB Host API功能
  11. GMAC接口(1)——GMAC简介
  12. linux 多核cpu监控,Linux 下多核CPU知识
  13. 有MDF文件和LDF文件之后怎么创建数据库
  14. Oracle 系列(oracle分区)
  15. ZooKeeper【基础 02】zookeeper-3.6.0 常用Shell命令(节点增删改查+监听器+四字指令)
  16. 管理故事:保罗与小男孩
  17. Java技能点--基本类型与非基本类型
  18. alin的学习之路:面试题 计算机网络相关
  19. [附源码]java毕业设计同德佳苑物业管理系统论文
  20. Linux编程基础:1~6章实训编程题

热门文章

  1. STM32F103C8T6之SG90舵机控制
  2. MATLAB图像形状识别
  3. html 图片浮层,纯css图片悬浮代码(expression)
  4. pandas datetime数据类型
  5. 开源中文分词FudanNLP
  6. Android开发中,如何从系统固件里提取可用的APK
  7. 索尼电视总出现Android,索尼BRAVIA电视推送更新:升级安卓8.0,修复众多问题
  8. 华大MCU(五):HC32F460串口IAP升级boot部分
  9. 毕业设计 大学生心理健康管理平台
  10. php图书馆占座系统代码,PHP图书馆管理系统(源码+数据库脚本+截图)