简介
Swoft 数据库组件高度兼容 Laravel,支持原生 SQL、查询构造器和 Eloquent ORM,去掉了复杂的对象模型关联。数据库组件采用原生 PDO 的方式连接,IO 操作会被自动转换为类似 Swoole 的 MySQL 协程客户端,使开发变得简单,更贴近传统框架。
基础配置
数据库的配置位于 app/bean.php 文件,未使用繁琐的 .env 环境文件配置。配置的 db 是一个 bean 对象。
return [
'db' => [
'class' => SwoftDbDatabase::class,
'dsn' => 'mysql:dbname=dbname;host=127.0.0.1:3306',
'username' => 'test',
'password' => 'test',
'charset' => 'utf8mb4',
'prefix' => 't_',
'options' => [
PDO::ATTR_CASE => PDO::CASE_NATURAL
],
'config' => [
'collation' => 'utf8mb4_unicode_ci',
'strict' => true,
'timezone' => '+8:00',
'modes' => 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES',
'fetchMode' => PDO::FETCH_ASSOC
]
]
];
一般只需要修改 dsn,username,password,prefix这4个值即可,其他保持默认配置。
配置项说明:
- class:数据库类。自定义时需指定,默认为 Swoft 数据库类
- dsn:PDO 连接信息,指定数据库名称、地址及端口
- username:数据库用户名
- password:数据库密码
- charset:数据库字符集
- prefix:数据表前缀
- options:PDO 选项,参阅:PHP: PDO::setAttribute - Manual
- config:额外配置
- collation:字符集排序规则
- strict:是否启用严格模式
- timezone:时区设置。国内请设置 +8:00
- modes:连接模式,完整列表参考:MySQL :: MySQL 5.6 Reference Manual - Full List of SQL Modes
- fetchMode:PDO 获取模式,默认为 PDO::FETCH_ASSOC,即以关联数组返回,参考:PHP: PDO 预定义常量 - Manual
读写分离
'db' => [
'class' => Database::class,
'prefix'=>'sunny_',
'writes'=>[
[
'dsn' => 'mysql:dbname=writeDB;host=127.0.0.1',
'username' => 'root',
'password' => 'test',
]
],
'reads'=>[
[
'dsn' => 'mysql:dbname=readDB;host=127.0.0.1',
'username' => 'root',
'password' => 'test',
]
]
]
连接池
DB 的连接从 连接池 创建和释放,通过 ConnectionManager 类进行管理。创建的连接为短连接,操作执行失败后会重试 一次。每当调用 toSql() 方法或执行完毕后会将连接归还至连接池中。连接池的默认名称为 db.pool,使用的数据库配置来自 bean(‘db’),由 基础配置 提供。连接池配置同样位于 app/bean.php 文件中。
'db.pool' => [
'class' => SwoftDbPool::class,
'database' => bean('db'),
'minActive' => 10,
'maxActive' => 20,
'maxWait' => 0,
'maxWaitTime' => 0,
'maxIdleTime' => 60,
],
参数:
- class 是默认的 Pool 对象 你可以更具官方的自己继承实现,然后换成自己 的 Pool 类名就可以了
- database 驱动的数据库对象 是读 & 写连接配置的
- minActive 连接池需要维持的连接数
- maxActive 连接池最大保持的连接数
- maxWait 连接池最多等待连接数, 如果没有限制为0(默认)
- maxWaitTime 连接最大等待时间,单位秒,如果没有限制为0(默认)
- maxIdleTime 连接最大空闲时间,单位秒
连接池数量根据数据库配置的承受能力设置,并且连接池数量多不代表越快;连接池的数量会跟 Worker 进程挂钩,每个 Worker 进程会创建属于当前进程的连接池。所以如果设置 minActive 和 maxActive 需要注意,这里的数量会是乘以 Worker 进程数量。
如果 minActive 是 5 ,swoole的 worker_num 配置是 2 ,那么这个 minActive 至少会创建 10 个连接,所以一定要注意这里。
Swoft的连接池只有在进行数据库操作的时候才会去创建连接,并不是框架启动的时候创建连接。
来源:https://8code.net/index/index/article/id/54
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要
PHP进阶架构师>>>视频、面试文档免费获取shimo.im![17f365ae36bad9009d6e5b449ecf5d86.png](https://i-blog.csdnimg.cn/blog_migrate/39aed8bf792201225b420e91a056e2c6.png)
或 者关注咱们下面的知乎专栏
PHP架构师圈子zhuanlan.zhihu.com![3906c277b81203f482f332dc7168d3dd.png](https://i-blog.csdnimg.cn/blog_migrate/f9a5a6049eece499e1b7538b81784444.jpeg)