Laravel 如何使用数据库连接池提高性能

9 篇文章 0 订阅
1 篇文章 0 订阅

Swoole MySQL Proxy
SMProxy文档地址
一个基于 MySQL 协议,Swoole 开发的MySQL数据库连接池。

原理

将数据库连接作为对象存储在内存中,当用户需要访问数据库时,首次会建立连接,后面并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。 使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。

同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。 也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。超出最大连接数会采用协程挂起,等到有连接关闭再恢复协程继续操作。

特性

支持读写分离
支持数据库连接池,能够有效解决 PHP 带来的数据库连接瓶颈
支持 SQL92 标准
采用协程调度
支持多个数据库连接,多个数据库,多个用户,灵活搭配
遵守 MySQL 原生协议,跨语言,跨平台的通用中间件代理
支持 MySQL 事务
支持 HandshakeV10 协议版本
完美兼容 MySQL5.5 - 8.0
兼容各大框架,无缝提升性能

环境要求:
PHP 7.0+
SWOOLE 2.1.3+
SMProxy
Laravel
MySQL

安装
1、安装swoole
pecl install swoole

2、安装 SMProxy
(推荐)直接下载最新发行版的 PHAR 文件,解压即用:
https://github.com/louislivi/SMProxy/releases/latest
或者使用 Git 切换任意版本:

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

我是使用的推荐方式,下载压缩包,并解压,放到你服务器的任意位置,我是放到我的所有软件包一起
在这里插入图片描述
配置
1、配置database.json
配置文件位于 smproxy/conf 目录中,其中大写 ROOT 代表当前 SMProxy 根目录。
在这里插入图片描述

{
  "database": {
    "account": {
      "crown": {	//自定义用户名,随便取,只需要跟下面serverInfo中的account相对应即可
        "user": "root",//mysql数据库用户名
        "password": "Kmrgs2019"//mysql数据库密码
      }
    },
    "serverInfo": {
      "server1": { //自定义数据库连接信息,随便取,只需要跟下面databases中的serverInfo相对应,read读库可不配置
        "write": {//写库
          "host": ["39.97.187.5"],//写库地址 多个用[]表示
          "port": 3306,//写库端口
          "timeout": 2,//写库连接超时时间(秒)
          "account": "crown"//跟上面自定义的用户名一致
        },
        "read": {//读库,没有可删掉read列 或填写与写库数据一致内容
          "host": ["39.97.187.5"],
          "port": 3306,
          "timeout": 2,
          "account": "crown",
          "startConns": "swoole_cpu_num()*10",
          "maxSpareConns": "swoole_cpu_num()*10",
          "maxSpareExp": 3600,
          "maxConns": "swoole_cpu_num()*20"
        }
      }
    },
    "databases": {
      "crown": {//数据库别名
      	"databaseName":"crown", //可选,指定真实链接数据库名称(默认不指定与别名相同)
        "serverInfo": "server1",//自定义数据库连接信息 与serverInfo中的自定义数据库连接信息相对应
        "startConns": "swoole_cpu_num()*2",
        "maxSpareConns": "swoole_cpu_num()*2",
        "maxSpareExp": 3600,
        "maxConns": "swoole_cpu_num()*2",
        "charset": "utf8mb4"
      }
    }
  }
}

注意注释项,是需要自己修改的,其他的参数意思可查看SMProxy文档

2、配置server.json
配置文件位于 smproxy/conf 目录中,其中大写 ROOT 代表当前 SMProxy 根目录。

{
  "server": {
    "user": "smp_root",//SMProxy服务用户,自己随便取,只需后面项目中配置一致即可
    "password": "smp_root",//SMProxy服务密码,同上
    "charset": "utf8mb4",
    "host": "0.0.0.0",//SMProxy地址,默认0.0.0.0
    "port": "3366",//SMProxy端口,默认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"
    }
  }
}

启动 SMProxy 服务(SMProxy [ start | stop | restart | status | reload ])
./SMProxy start

在这里插入图片描述

3、在项目中如何进行配置

Laravel框架.env文件

DB_CONNECTION=mysql
DB_HOST=0.0.0.0			//server.json中配置的host
DB_PORT=3366			//server.json中配置的port
DB_DATABASE=crown		//databse.json中配置的数据库名称
DB_USERNAME=smp_root	//server.json中配置的user
DB_PASSWORD=smp_root	//server.json中配置的password

其他框架配置查看SMProxy文档

MySQL8.0
SMProxy1.2.4及以上可直接使用
SMProxy1.2.4以下需要做兼容处理

测试 Laravel 是否能够正常连接数据库(随便写一个查询数据库接口即可测试链接是否正确)
出现错误请检查 SMProxy 日志,日志文件路径在server.json中配置,如果没有改动与conf目录同级

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是 Laravel 使用数据库、Redis 连接池的示例代码: 1. 数据库连接池示例代码 在 Laravel 中,可以通过配置文件来进行数据库连接池的配置。以下是一个示例的 `config/database.php` 文件的配置: ```php 'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => [ PDO::ATTR_PERSISTENT => true, // 使用持久连接 ], ], ``` 在上面的配置中,将 `PDO::ATTR_PERSISTENT` 设置为 `true`,即可使用持久连接,从而达到连接池的效果。 2. Redis 连接池示例代码 在 Laravel 中,可以通过配置文件来进行 Redis 连接池的配置。以下是一个示例的 `config/database.php` 文件的配置: ```php 'redis' => [ 'client' => env('REDIS_CLIENT', 'phpredis'), 'options' => [ 'cluster' => env('REDIS_CLUSTER', 'redis'), 'prefix' => env('REDIS_PREFIX', ''), ], 'default' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_DB', '0'), 'persistent' => true, // 使用持久连接 ], 'cache' => [ 'url' => env('REDIS_URL'), 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_CACHE_DB', '1'), 'persistent' => true, // 使用持久连接 ], ], ``` 在上面的配置中,将 `persistent` 设置为 `true`,即可使用持久连接,从而达到连接池的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值