tp5 使用SMproxy连接池来连接mysql数据库

摘要:
PHP连接池设计的初衷是PHP没有连接池,因此当发生高并发时,数据库将充满连接,一些数据库中间件(如Mycat)将无法使用SQL,例如,它不支持批量添加,而且过于臃肿。smproxy的原理是将数据库连接作为对象存储在内存中。当用户需要访问数据库时,将首次建立连接。它将从连接池中获取已建立的空闲连接对象,而不是建立新连接。

前言:之前面试的时候被问到tp5-mysql连接池的问题,一下就蒙了,不知道啥玩意,今天有时间特意百度了一下。

PHP连接池的设计初衷是PHP 没有连接池,所以高并发时数据库会出现连接打满的情况,Mycat 等数据库中间件会出现部分 SQL 无法使用,例如不支持批量添加等,而且过于臃肿。

smproxy的原理是将数据库连接作为对象存储在内存中,当用户需要访问数据库时,首次会建立连接,后面并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。 使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。 也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。超出最大连接数会采用协程挂起,等到有连接关闭再恢复协程继续操作。

好的废话不多说,安装环境要求,PHP >= 7.0 ,2.1.3<=Swoole <= 4.5+ , Git评论上看到的,我用的宝塔,直接安装的swoole是4.7 所以还是老老实实自己装吧。

swoole 地址 https://github.com/swoole/swoole-src/releases,我装的是4.4.20,评论里说没问题,想装哪个版本可以自己尝试一下。

下载完之后进入swoole目录执行phpize 

/www/server/php/72/bin/phpize

到了这里会生成configure文件

./configure --with-php-config=/www/server/php/72/bin/php-config

接着就是最后一步

make && make install

编译完之后在php.ini 中添加swoole扩展 extension=swoole.so

好了,至此swoole安装完成。

安装smproxy 也是git下载,地址https://github.com/louislivi/SMProxy/releases/latest

建议安装到项目的根目录下,看起来比较整洁吧,我第一次安装直接安装到/root目录下了,也没啥问题。

配置文件:位于smproxy/conf目录中,其中大写ROOT标识当前SMProxy根目录。

配置我就直接扒官方文档的吧,我就照着官方文档扒的,成功运行了。

database.json

{
  "database": {
    "account": {
      "自定义用户名": {
        "user": "必选,数据库账户",
        "password": "必选,数据库密码"
      },
      "...": "必选1个,自定义用户名 与serverInfo中的account相对应"
    },
    "serverInfo": {
      "自定义数据库连接信息": {
        "write": {
          "host": "必选,写库地址 多个用[]表示",
          "port": "必选,写库端口",
          "timeout": "必选,写库连接超时时间(秒)",
          "account": "必选,自定义用户名 与 account中的自定义用户名相对应",
          "maxConns": "重载,对应databases",
          "maxSpareConns": "重载,对应databases",
          "startConns": "重载,对应databases",
          "maxSpareExp": "重载,对应databases"
        },
        "read": {
          "host": "可选,读库地址 多个用[]表示",
          "port": "可选,读库端口",
          "timeout": "可选,读库连接超时时间(秒)",
          "account": "可选,自定义用户名 与 account中的自定义用户名相对应",
          "maxConns": "重载,对应databases",
          "maxSpareConns": "重载,对应databases",
          "startConns": "重载,对应databases",
          "maxSpareExp": "重载,对应databases"
        }
      },
      "...": "必选1个,自定义数据库连接信息 与databases中的serverInfo相对应,read读库可不配置"
    },
    "databases": {
      "数据库别名": {
        "databaseName": "可选,指定真实链接数据库名称(默认不指定与别名相同)",
        "serverInfo": "必选,自定义数据库连接信息 与serverInfo中的自定义数据库连接信息相对应",
        "maxConns": "必选,该库服务最大连接数,支持计算",
        "maxSpareConns": "必选,该库服务最大空闲连接数,支持计算",
        "startConns": "可选,该库服务默认启动连接数,支持计算",
        "maxSpareExp": "可选,该库服务空闲连接数最大空闲时间(秒),默认为0,支持计算",
        "charset": "可选,该库编码格式"
      },
      "...": "必选1个,数据库名称 多个数据库配置多个"
    }
  }
}

  基本上改下数据库配置就可以了,需要改动的地方不大,具体也没细研究,swoole也不大会,就按官方默认的来了。

server.json

{
  "server": {
    "user": "必选,SMProxy服务用户",
    "password": "必选,SMProxy服务密码",
    "charset": "可选,SMProxy编码,默认utf8mb4",
    "host": "可选,SMProxy地址,默认0.0.0.0",
    "port": "可选,SMProxy端口,默认3366 如需多个以`,`隔开",
    "mode": "可选,SMProxy运行模式,SWOOLE_PROCESS多进程模式(默认),SWOOLE_BASE基本模式",
    "sock_type": "可选,sock类型,SWOOLE_SOCK_TCP tcp",
    "logs": {
      "open":"必选,日志开关,true 开 false 关",
      "config": {
        "system": {
          "log_path": "必选,SMProxy系统日志目录",
          "log_file": "必选,SMProxy系统日志文件名",
          "format": "必选,SMProxy系统日志目录日期格式"
        },
        "mysql": {
          "log_path": "必选,SMProxyMySQL日志目录",
          "log_file": "必选,SMProxyMySQL日志文件名",
          "format": "必选,SMProxyMySQL日志目录日期格式"
        }
      }
    },
    "swoole": {
      "worker_num": "必选,SWOOLE worker进程数,支持计算",
      "max_coro_num": "必选,SWOOLE 协程数,推荐不低于3000",
      "pid_file": "必选,worker进程和manager进程pid目录",
      "open_tcp_nodelay": "可选,关闭Nagle合并算法",
      "daemonize": "可选,守护进程化,true 为守护进程 false 关闭守护进程",
      "heartbeat_check_interval": "可选,心跳检测",
      "heartbeat_idle_time": "可选,心跳检测最大空闲时间",
      "reload_async": "可选,异步重启,true 开启异步重启 false 关闭异步重启",
      "log_file": "可选,SWOOLE日志目录"
    },
    "swoole_client_setting": {
      "package_max_length": "可选,SWOOLE Client 最大包长,默认16777216MySQL最大支持包长"
    },
    "swoole_client_sock_setting": {
      "sock_type": "可选,SWOOLE Client sock 类型,默认tcp 仅支持tcp"
    }
  }
}

  在tp5项目中进行配置。

database.php

'type' => 'mysql',
// 服务器地址
'hostname' => 'server.json中配置的host',
// 数据库名
'database' => 'databse.json中配置的数据库名称',
// 用户名
'username' => 'server.json中配置的user',
// 密码
'password' => 'server.json中配置的password',
// 端口
'hostport' => 'server.json中配置的port',

 

配置完成,在smproxy目录下运行 bin/SMProxy start,smproxy启动成功。如图

tp5 使用SMproxy连接池来连接mysql数据库第1张

检查一下 ps -ef|grep SMProxy

tp5 使用SMproxy连接池来连接mysql数据库第2张

成功运行,程序的数据库连接也正常。 

写到这里,去运行一下原有的程序,发现可以正常运行,详细的功能暂时就不多做描述了,有心的同学可以去看官方文档。https://smproxy.gitee.louislivi.com/

经测试,发现server.json 中的user、password对tp5 database.php中的username和password没有任何影响,database.php中的数据库账号密码还是需要使用mysql的账号密码。使用server.js 中的账号密码无效。

经测试,发现database.json与database.php的对应关系如下

tp5 使用SMproxy连接池来连接mysql数据库第3张

免责声明:文章转载自《tp5 使用SMproxy连接池来连接mysql数据库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linq join多字段正则表达式模式修正符下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux Oracle 11g dataguard物理standby的配置

这两天研究了下oracle 11g dataguard 物理standby 功能,总体来说这个功能满足公司需求,好了,不多说了,以下是详细的配置过程。 主库: IP:192.168.77.5 主机名:nod1 ORACLE_SID=test ORACLE_BASE=/oracle/app/oracle ORACLE_HOME=/oracle/app/or...

Oracle 表空间

表空间(table space)是Oracle数据库中最大的逻辑结构。从逻辑上说,Oracle数据库是由若干个表空间组成的。表空间与数据库的物理结构有着十分密切的关系,它与磁盘上若干个数据文件相对应。从物理上说数据库的数据被存放在数据文件中,从逻辑上说数据是被存放在表空间中。 表空间是个重要的概念,因为它提供了一套有效组织数据的方法。数据库的逻辑配置实际上...

MySQL数据目录更改及相关问题解决方案

步骤相关 1、停掉MySQL服务 service mysql stop 2、把旧的数据目录/var/lib/mysql备份到新的数据目录/data/mysql cp /var/lib/mysql /data -R 3、给mysql组的mysql用户赋予新的数据目录的权限 chown -R mysql:mysql /data/mysql 4、修改my.cnf...

Jedis的配置和优化

参数名:maxTotal 含义:资源池最大连接数 【默认值:8】 使用建议:需要考虑以下几点 1.业务希望的Redis并发量 2.客户端执行命令时间 3.Redis资源:例如应用个数(客户端)* maxTotal 不能超过Redis服务端的最大连接数(config get maxclients) 4.资源开销:例如虽然希望控制空闲连接,但是不希望因为连接池...

MySQL最新版本 MySQL5.7.11 批量自动化一键式安装(转)

--背景云端 以前都喜欢了源码安装MySQL,总觉得源码是高大上的事情,不过源码也需要时间,特别是make的时候,如果磁盘和cpu差的话,时间很长很长,在虚拟机上安装mysql尤其甚慢了。 现在业务发展了,开始在云上部署了,需要经常安装mysql,有的时候一次部署很多台,如果还是源码安装一个个去执行,效率就比较差了,所以准备采用更快效率的二进制来实现一键式...

初试Code First(附Demo)

初试Code First(附Demo) 写在前面 新建项目 安装EntityFramework程序包 创建模型 创建上下文DbContext 创建数据库、读/写数据 配置连接字符串 Code First 迁移 示例Demo下载 后记 以前逛园子的时候,很多大牛写的一些东西,什么AOP、DDD之类的,看过之后一头雾水,远望大牛,回过头看看自己,原来程序员...