数据库配置
备注
有关当前支持的数据库驱动,请参阅 支持的数据库。
配置文件
CodeIgniter 提供了一个配置文件,用于存储你的数据库连接信息(用户名、密码、数据库名等)。该配置文件位于 app/Config/Database.php。你也可以在 .env 文件中设置数据库连接值。更多详细信息,请参见下文。
设置默认数据库
配置设置存储在一个类属性中,该属性是一个具有以下原型的数组:
<?php
namespace Config;
use CodeIgniter\Database\Config;
class Database extends Config
{
// ...
public array $default = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'database_name',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => true,
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];
// ...
}
类属性的名称即为连接名,可以在连接时使用该名称来指定组名。
备注
SQLite3 数据库的默认位置是 writable 目录。 如果要更改位置,必须设置新目录的完整路径(例如,'database' => WRITEPATH . 'db/database_name.db')。
DSN
某些数据库驱动(如 Postgre、OCI8)需要完整的 DSN(数据源名称)字符串才能连接。 但如果对于需要 DSN 的驱动你未指定 DSN 字符串,CodeIgniter 将尝试使用其余提供的设置来构建它。
如果指定了 DSN,你应该使用 'DSN' 配置设置,就像使用驱动程序底层的原生 PHP 扩展一样,如下所示:
// OCI8
public array $default = [
'DSN' => '//localhost/XE',
// ...
];
通用 DSN 格式
你也可以以通用格式(类似 URL)设置 DSN。在这种情况下,DSN 必须具有以下原型:
public array $default = [
'DSN' => 'DBDriver://username:password@hostname:port/database',
// ...
];
使用通用版本的 DSN 字符串连接时,若要覆盖默认的配置值, 请将配置变量作为查询字符串添加:
// MySQLi
public array $default = [
'DSN' => 'MySQLi://username:password@hostname:3306/database?charset=utf8mb4&DBCollat=utf8mb4_general_ci',
// ...
];
// Postgre
public array $default = [
'DSN' => 'Postgre://username:password@hostname:5432/database?charset=utf8&connect_timeout=5&sslmode=require',
// ...
];
备注
如果你提供了 DSN 字符串但缺少某些有效设置(例如,数据库字符集),而这些设置存在于其余的配置字段中,CodeIgniter 将会追加它们。
故障转移
你也可以指定故障转移,以应对主连接因某种原因无法连接的情况。 这些故障转移可以通过为连接设置 failover 来指定,如下所示:
<?php
namespace Config;
use CodeIgniter\Database\Config;
class Database extends Config
{
// ...
public array $default = [
// ...
'failover' => [
[
'hostname' => 'localhost1',
'username' => '',
'password' => '',
'database' => '',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => true,
'DBDebug' => true,
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
],
[
'hostname' => 'localhost2',
'username' => '',
'password' => '',
'database' => '',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => true,
'DBDebug' => true,
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
],
],
// ...
];
// ...
}
你可以根据需要指定任意数量的故障转移。
设置多个数据库
你可以选择性地存储多组连接值。 例如,如果你在单个安装下运行多个环境(开发、生产、测试等), 可以为每个环境设置一个连接组,然后根据需要在各组之间切换。例如,要设置一个“test”环境,你可以这样做:
<?php
namespace Config;
use CodeIgniter\Database\Config;
class Database extends Config
{
// ...
public array $test = [
'DSN' => '',
'hostname' => 'localhost',
'username' => 'root',
'password' => '',
'database' => 'database_name',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => true,
'DBDebug' => true,
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'compress' => false,
'encrypt' => false,
'strictOn' => false,
'failover' => [],
];
// ...
}
然后,要全局告知系统使用该组,你需要设置配置文件中的这个变量:
<?php
namespace Config;
use CodeIgniter\Database\Config;
class Database extends Config
{
// ...
public string $defaultGroup = 'test';
// ...
}
备注
名称 test 是任意的,你可以将其设置为任何名称。
默认情况下,我们为主连接使用了 default 这个词,
但它也可以根据你的项目需求重命名为更相关的名称。
自动切换数据库
你可以修改配置文件,通过在类的构造函数中添加必要的逻辑来检测环境,并自动将 defaultGroup 的值更新为正确的组:
<?php
namespace Config;
use CodeIgniter\Database\Config;
/**
* Database Configuration
*/
class Database extends Config
{
// ...
public $development = [/* ... */];
public $test = [/* ... */];
public $production = [/* ... */];
public function __construct()
{
// ...
$this->defaultGroup = ENVIRONMENT;
}
}
使用 .env 文件进行配置
你也可以在 .env 文件中保存配置值,并使用当前服务器的数据库设置。你只需要输入与默认组配置设置不同的值。这些值应遵循以下格式,其中 default 是组名:
database.default.username = 'root';
database.default.password = '';
database.default.database = 'ci4';
但你不能通过设置环境变量来添加新属性,也不能将标量值更改为数组。详情请参阅 环境变量作为数据替换。
因此,如果你想在 MySQL 中使用 SSL,需要一个变通方法。例如,在你的 .env 文件中将数组值设置为 JSON 字符串:
database.default.encrypt = {"ssl_verify":true,"ssl_ca":"/var/www/html/BaltimoreCyberTrustRoot.crt.pem"}
然后在 Config 类的构造函数中解码:
<?php
namespace Config;
use CodeIgniter\Database\Config;
/**
* Database Configuration
*/
class Database extends Config
{
// ...
public function __construct()
{
// ...
$array = json_decode($this->default['encrypt'], true);
if (is_array($array)) {
$this->default['encrypt'] = $array;
}
}
}
配置值说明
配置名 |
说明 |
|---|---|
DSN |
DSN 连接字符串(一个一体化的配置序列)。 |
hostname |
你的数据库服务器的主机名。通常为 'localhost'。 |
username |
用于连接数据库的用户名。( |
password |
用于连接数据库的密码。( |
database |
你要连接的数据库的名称。 备注 CodeIgniter 不支持在表名和列名中使用点( |
DBDriver |
数据库驱动名称。大小写必须与驱动名称匹配。
你可以设置一个完全限定的类名来使用自定义驱动。
支持的驱动: |
DBPrefix |
一个可选的表前缀,当运行 查询构建器 查询时将被添加到表名前。这允许多个 CodeIgniter 安装共享一个数据库。 |
pConnect |
true/false(布尔值)- 是否使用持久连接。 |
DBDebug |
true/false(布尔值)- 当数据库发生错误时是否抛出异常。 |
charset |
与数据库通信时使用的字符集。 |
DBCollat |
(仅 |
swapPre |
一个默认的表前缀,应被 |
schema |
(仅 |
encrypt |
(仅 |
compress |
(仅 |
strictOn |
(仅 |
port |
数据库端口号 - 默认端口使用空字符串 |
foreignKeys |
(仅 重要 SQLite3 外键约束默认是禁用的。 请参阅 SQLite 文档。 要强制启用外键约束,请将此配置项设置为 true。 |
busyTimeout |
(仅 |
synchronous |
(仅 |
numberNative |
(仅 |
foundRows |
(仅 |
dateFormat |
默认的日期/时间格式,遵循 PHP 的 DateTime format。
* |
备注
根据你使用的数据库驱动(MySQLi、Postgre 等),并非所有值都是必需的。例如,使用 SQLite3 时,
你不需要提供用户名或密码,数据库名将是数据库文件的路径。
MySQLi
hostname
配置套接字连接
要通过文件系统套接字连接到 MySQL 服务器,应将套接字的路径指定在
'hostname' 设置中。CodeIgniter 的 MySQLi 驱动将检测到此设置并正确配置连接。
// MySQLi over a socket
public array $default = [
// ...
'hostname' => '/cloudsql/toolbox-tests:europe-north1:toolbox-db',
// ...
'DBDriver' => 'MySQLi',
// ...
];
encrypt
MySQLi 驱动接受一个包含以下选项的数组:
ssl_key- 私钥文件的路径ssl_cert- 公钥证书文件的路径ssl_ca- 证书颁发机构文件的路径ssl_capath- 包含以 PEM 格式存储的受信任 CA 证书的目录路径ssl_cipher- 用于加密的*允许*密码列表,以冒号(:)分隔ssl_verify- true/false(布尔值)- 是否验证服务器证书