php搭建mysql连接池
一直以来,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连接池相关推荐
- mysql多个字符串连接池_使用Coroutine\Channel实现一个简单的MySQL连接池
Channel通道,类似于go语言的chan,支持多生产者协程和多消费者协程,Swoole底层自动实现了协程的切换和调度 Channel实现原理 通道与PHP的Array类似,仅占用内存,没有其他额外 ...
- mysql内连接和外连接的区别_Swoole4创建Mysql连接池
一 .什么是mysql连接池 场景:每秒同时有1000个并发,但是这个mysql同时只能处理400个连接,mysql会宕机. 解决方案:连接池,这个连接池建立了200个和mysql的连接,这1000个 ...
- MySQL会回收使用中的连接吗_Node.js实现mysql连接池使用事务自动回收连接的方法示例...
本文实例讲述了Node.js实现mysql连接池使用事务自动回收连接的方法.分享给大家供大家参考,具体如下: var mysql = require('mysql'), Connection = re ...
- mysql清理连接数缓存,MySQL连接池、线程缓存、线程池的区别
1. MySQL连接池 连接池通常实现在client端,是指应用(客户端)预先创建一定的连接,利用这些连接服务于客户端所有的DB请求.如果某一个时刻,空闲的连接数小于DB的请求数,则需要将请求排队,等 ...
- php 协程 mysql_实现一个协程版mysql连接池
实现一个协程版的mysql连接池,该连接池支持自动创建最小连接数,自动检测mysql健康:基于swoole的chanel. 最近事情忙,心态也有点不积极.技术倒是没有落下,只是越来越不想写博客了.想到 ...
- node mysql limit_node中mysql连接池的connectionLimit指什么,它和mysql的最小连接数和最大连接数的关系是什么?...
问题1:node中mysql连接池的connectionLimit指什么,它和mysql的最小连接数和最大连接数的关系是什么 问题2:mysql max_connections是什么,max_used ...
- swoole原生mysql进程池_swoole的mysql连接池怎么弄
swoole的mysql连接池怎么弄 发布时间:2020-12-28 09:54:07 来源:亿速云 阅读:68 作者:小新 这篇文章给大家分享的是有关swoole的mysql连接池怎么弄的内容.小编 ...
- node mysql 连接池创建_Node.js使用MySQL连接池的方法实例
本文实例讲述了Node.js使用MysqL连接池的方法.分享给大家供大家参考,具体如下: Nodejs如何使用MysqL Nodejs要连接MysqL,可以使用Nodejs的MysqL驱动来实现.比如 ...
- 关于Tomcat与MySQL连接池问题的详解
转载自 关于Tomcat与MySQL连接池问题的详解 研究了一天,终于有所收获,希望对大家有所帮助.首先请大家注意:这里尤其讨论Tomcat5.5版本中遇到的问题,为什么尤其单对这个版本,我一会儿 ...
- easyswoole数据库连接池_如何在 Swoole 中优雅的实现 MySQL 连接池
如何在 Swoole 中优雅的实现 MySQL 连接池 一.为什么需要连接池 ? 数据库连接池指的是程序和数据库之间保持一定数量的连接不断开, 并且各个请求的连接可以相互复用, 减少重复连接数据库带来 ...
最新文章
- 「SVN」Linux下svn使用命令
- 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析...
- 软件工程作业 - word count
- return 、break 和 continue的区别
- Android基础View回顾
- checkbox选中与取消选择
- 【优化求解】基于matlab模拟退火算法求解函数极值问题【含Matlab源码 1203期】
- 华为数通HCNA学习资料
- 如何下载谷歌地球高程为TIF格式的文件
- Android开启OTG功能/USB Host API功能
- GMAC接口(1)——GMAC简介
- linux 多核cpu监控,Linux 下多核CPU知识
- 有MDF文件和LDF文件之后怎么创建数据库
- Oracle 系列(oracle分区)
- ZooKeeper【基础 02】zookeeper-3.6.0 常用Shell命令(节点增删改查+监听器+四字指令)
- 管理故事:保罗与小男孩
- Java技能点--基本类型与非基本类型
- alin的学习之路:面试题 计算机网络相关
- [附源码]java毕业设计同德佳苑物业管理系统论文
- Linux编程基础:1~6章实训编程题
热门文章
- STM32F103C8T6之SG90舵机控制
- MATLAB图像形状识别
- html 图片浮层,纯css图片悬浮代码(expression)
- pandas datetime数据类型
- 开源中文分词FudanNLP
- Android开发中,如何从系统固件里提取可用的APK
- 索尼电视总出现Android,索尼BRAVIA电视推送更新:升级安卓8.0,修复众多问题
- 华大MCU(五):HC32F460串口IAP升级boot部分
- 毕业设计 大学生心理健康管理平台
- php图书馆占座系统代码,PHP图书馆管理系统(源码+数据库脚本+截图)