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...
file
下载前两个压缩包中的一个

或者使用 Git 切换任意版本:

git clone https://github.com/louislivi/smproxy.git
composer install --no-dev # 如果你想贡献你的代码,请不要使用 --no-dev 参数。

3.配置数据库连接池

假设MySQL数据库账号为root 密码为654321 库名为 test

编辑SMProxyconf/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 文档

本帖由系统于 8个月前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 13

@半人间 能够有效降低数据库压力

9个月前 评论

打算用在生成环境上,想请问下有什么不适用的地方没有,害怕真用上了,如果遇到坑就没法解决了

6个月前 评论
黑将军

能上生产环境吗?

2个月前 评论

@黑将军 专为swoole写的框架都是用连接池的,生产上没问题,点进去看看我那个es的im demo

2个月前 评论

@Double-Jin 请问为什么我按照这个配置去部署会提示以下错误:
*SQLSTATE[HY000] [1045] Access denied for user 'root'@'localhost' (using password: YES) (SQL: select from admin_permissions)**

navicat 用 3366 端口和配置的账号去连接数据库是没问题的,能正常查出数据

2个月前 评论

@zbsbjb 可能是mysql 授权问题 可以百度Access denied for user 'root'@'localhost' 寻找问题原因,你可以先修改为127.0.0.1 试试

2个月前 评论

@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创建账号,还是我漏了哪个步骤?谢谢

2个月前 评论

@zbsbjb 仔细阅读文档 有两个账号 一个是smproxy的 一个是mysql的

2个月前 评论
黑将军

file
为什么我在Mac下测试总卡在这儿呢?

2个月前 评论

@黑将军
看日志,把日志贴出来

2个月前 评论
黑将军

@louislivi 没有输出日志,已经在github上提issue了

2个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!