配置
优质
小牛编辑
129浏览
2023-12-01
GitHub: https://github.com/swoft-cloud/swoft-db
简介
Swoft 数据库组件高度兼容 Laravel,支持原生 SQL、查询构造器和 Eloquent ORM,去掉了复杂的对象模型关联。数据库组件采用原生 PDO 的方式连接,IO 操作会被自动转换为类似 Swoole 的 MySQL 协程客户端,使开发变得简单,更贴近传统框架。
为什么使用原生 PDO:由于 MySQLnd 模式的PDO
、MySQLi
扩展会加入 Hook 监听,如果未启用 MySQLnd 将不支持协程化。安装
数据库组件需独立安装:
composer require swoft/db
基础配置
数据库的配置位于 app/bean.php
文件,未使用繁琐的 .env
环境文件配置。配置的 db
是一个 bean
对象。
return [
'db' => [
'class' => Swoft\Db\Database::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
]
]
];
配置方式类似 Yii2 的对象属性注入。可通过 bean('db')
获取当前配置的 Database
对象。
配置项说明:
class
:数据库类。自定义时需指定,默认为 Swoft 数据库类dsn
:PDO 连接信息,指定数据库名称、地址及端口username
:数据库用户名password
:数据库密码charset
:数据库字符集prefix
:数据表前缀options
:PDO 选项,参阅:PHP: PDO::setAttribute - Manualconfig
:额外配置collation
:字符集排序规则strict
:是否启用严格模式timezone
:时区设置。国内请设置+8:00
modes
:连接模式,完整列表参考:MySQL :: MySQL 5.6 Reference Manual - Full List of SQL ModesfetchMode
:PDO 获取模式,默认为PDO::FETCH_ASSOC
,即以关联数组返回,参考:PHP: PDO 预定义常量 - Manual
读写分离
'db_rw' => [
'charset' => 'utf8mb4',
'prefix' => 't_',
'config' => [
'collation' => 'utf8mb4_unicode_ci',
'strict' => true,
'timezone' => '+8:00',
'modes' => 'NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES'
],
'writes' => [
[
'dsn' => 'mysql:dbname=db-write;host=127.0.0.1:3306',
'username' => 'write',
'password' => 'write'
]
],
'reads' => [
[
'dsn' => 'mysql:dbname=db-read;host=127.0.0.1:3306',
'username' => 'read',
'password' => 'read'
]
]
]
writes
:写 配置,执行 增、删、改 操作时会从 连接池 随机选择 写 节点reads
:读 配置,执行 读 操作时会从 连接池 随机选择 读 节点
读写配置中公共部分请参考 基础配置,其中 dsn
、username
、password
、charset
、prefix
、options
、config
支持配置公共应用,之后在 writes/reads
中配置差异部分即可。
连接池
使用过 Swoft 1.0 的小伙伴对连接池并不陌生,2.x 相比更加简洁。
DB
的连接从 连接池 创建和释放,通过 ConnectionManager
类进行管理。创建的连接为短连接,操作执行失败后会重试 一次。每当调用 toSql()
方法或执行完毕后会将连接归还至连接池中。连接池的默认名称为 db.pool
,使用的数据库配置来自 bean('db')
,由 基础配置 提供。连接池配置同样位于 app/bean.php
文件中。