Laravel,PHP 如何使用数据库连接池提高性能
数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
需要
- PHP 7.0+
- SWOOLE 2.1+
- SMProxy
- Laravel
- MySQL
1.安装swoole
pecl install swoole
2.安装SMProxy
(推荐)直接下载最新发行版的 PHAR 文件,解压即用:
https://github.com/louislivi/smproxy/relea...
下载前两个压缩包中的一个
或者使用 Git 切换任意版本:
git clone https://github.com/louislivi/smproxy.git
composer install --no-dev # 如果你想贡献你的代码,请不要使用 --no-dev 参数。
3.配置数据库连接池
假设MySQL数据库账号为root
密码为654321
库名为 test
编辑SMProxy
的conf/database.json
文件
{
"database": {
"account": {
"root": {
"user": "root",//数据库账号
"password": "654321"//数据库密码
}
},
"serverInfo": {
"server1": {
"write": {//写库
"host": "127.0.0.1",//数据库地址
"port": 3306,
"timeout": 0.5,//连接超时时间
"flag": 0,
"account": "root"
},
"read": {//读库,没有可删掉read列 或填写与写库数据一致内容
"host": "127.0.0.1",
"port": 3306,
"timeout": 0.5,
"flag": 0,
"account": "root"
}
},
"databases": {
"test": {
"serverInfo": "server1",
"startConns": "swoole_cpu_num()*10",
"maxSpareConns": "swoole_cpu_num()*10",
"maxSpareExp": 3600,
"maxConns": "swoole_cpu_num()*20",
"charset": "utf-8"
}
}
}
}
随后配置SMProxy
的账号密码 在conf/server.json
文件
{
"server": {
"user": "SMProxy", //SMProxy账号
"password": "SMProxy", //SMProxy密码
"charset": "utf8mb4",
"host": "0.0.0.0",
"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": 16777216
},
"swoole_client_sock_setting": {
"sock_type": "SWOOLE_SOCK_TCP"
}
}
}
启动SMProxy
服务
./SMProxy start
配置Laravel数据库信息
.env
文件
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3366
DB_DATABASE=test
DB_USERNAME=SMProxy
DB_PASSWORD=SMProxy
测试Laravel是否能够正常连接数据库
- 出现错误请检查SMProxy日志
配置完成
SMProxy 文档
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
真的有用吗?
@半人间 能够有效降低数据库压力
打算用在生成环境上,想请问下有什么不适用的地方没有,害怕真用上了,如果遇到坑就没法解决了
能上生产环境吗?
@黑将军 专为swoole写的框架都是用连接池的,生产上没问题,点进去看看我那个es的im demo
@Double-Jin 请问为什么我按照这个配置去部署会提示以下错误:
*SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select from admin_permissions)**
navicat 用 3366 端口和配置的账号去连接数据库是没问题的,能正常查出数据
@zbsbjb 可能是mysql 授权问题 可以百度
Access denied for user 'root'@'localhost'
寻找问题原因,你可以先修改为127.0.0.1
试试@黑将军 可以的
@louislivi
环境:php:7.3.4 swoole:4.3.5 SMProxy:1.2.8
server.json 配置的账号:smproxy
database.json配置的账号:root
navicat和 mysql -usmproxy -p -P3366 -h 127.0.0.1都是能通过smproxy账号连接到数据库的
ps:在navicat使用某个数据库时会弹出"Lost connection to MySQL server during query"的错误,之后就能正常使用了
.env 配置连接的账号smproxy 提示smproxy这个账号 Access denied for user 'smproxy'@'localhost'
修改后:
.env 配置连接的账号root 成功连接mysql
原本不是通过SMProxy监听的3366端口和server.json配置的账号密码连接后获取到代理返回的mysql连接吗,为何这里的sever.json配置的账号没有生效而需要使用root账号去连接数据库呢?sever.json配置的账号难道也需要去mysql创建账号,还是我漏了哪个步骤?谢谢
@zbsbjb 仔细阅读文档 有两个账号 一个是smproxy的 一个是mysql的
为什么我在Mac下测试总卡在这儿呢?
@黑将军
看日志,把日志贴出来
@louislivi 没有输出日志,已经在github上提issue了
怎么配置达到最优
smproxy只有一组帐号密码,可以进行读写分离。
但如果想业务层只读,看起来是不好实现的?
2020-08-23 11:08:01 [warning] SMProxy@Connection 127.0.0.1:3306 waiting timeout, timeout=0.5 (/www/wwwroot/SMProxy/src/MysqlPool/MySQLPool.php:284). 这是没连上? 服务器本地mysql8.0
我一直都是出现这个错误,请问是哪里搞错了?我也是按照上边文档来的,我数据库账号和数据库密码分别是root和654321,然后就数据库地址不一样,其他完全一样的,运行的时候就出现这错误了
本机上有个数据库,其他服务器上还有个数据库,本地配置可以访问,但是其他服务器上的数据库怎么配置访问,最新的版本支持swoole4.6吗?
搭建成功,但是感觉比直连慢呀
@louisliv 搭建成功了,启动smproxy之后可以连接 ,但是如果连接成功后放置一段时间再次刷新请求,就会一直连接不上,只有再次重启smproxy才可以连接,这是什么问题
100qps 感觉作用不大