数据库配置
备注
请参阅 支持的数据库 以获取当前支持的数据库驱动。
配置文件
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' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306,
];
// ...
}
类属性的名称是连接名称,在连接时可以用作指定组名。
备注
SQLite3 数据库的默认位置是在 writable 文件夹中。如果要更改位置,则必须设置新文件夹的完整路径。
DSN
某些数据库驱动程序(如 Postgre、OCI8)需要完整的 DSN 字符串才能连接。但是,如果你没有为需要 DSN 字符串的驱动程序指定 DSN 字符串,CodeIgniter 将尝试使用其余提供的设置来构建它。
如果指定了 DSN,你应该使用 'DSN'
配置设置,就像你正在使用驱动程序的底层原生 PHP 扩展一样,如下所示:
// OCI8
public array $default = [
'DSN' => '//localhost/XE',
// ...
];
通用方式的 DSN
你还可以以通用方式(URL 格式)设置数据源名称。在这种情况下,DSN 必须具有以下原型:
public array $default = [
'DSN' => 'DBDriver://username:password@hostname:port/database',
// ...
];
要使用 DSN 字符串的通用版本覆盖默认配置值,请将配置变量作为查询字符串添加:
// MySQLi
public array $default = [
'DSN' => 'MySQLi://username:password@hostname:3306/database?charset=utf8&DBCollat=utf8_general_ci',
// ...
];
// Postgre
public array $default = [
'DSN' => 'Postgre://username:password@hostname:5432/database?charset=utf8&connect_timeout=5&sslmode=1',
// ...
];
备注
如果你提供了一个 DSN 字符串,但缺少配置字段中存在的一些有效设置(例如数据库字符集),CodeIgniter 将会追加它们。
故障转移
你还可以针对主连接由于某些原因无法连接的情况指定故障转移。可以通过像这样为连接设置故障转移来指定故障转移:
<?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' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
],
[
'hostname' => 'localhost2',
'username' => '',
'password' => '',
'database' => '',
'DBDriver' => 'MySQLi',
'DBPrefix' => '',
'pConnect' => true,
'DBDebug' => true,
'charset' => 'utf8',
'DBCollat' => 'utf8_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
],
],
// ...
];
// ...
}
你可以指定任意多个故障转移。
设置多个数据库
你可以可选地存储多个连接值集。例如,如果你在单个安装下运行多个环境(开发、生产、测试等),则可以为每个环境设置一个连接组,然后根据需要在组之间切换。例如,要设置“测试”环境,你可以这样做:
<?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' => 'utf8',
'DBCollat' => 'utf8_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;
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,你需要一个 hack。例如,在你的 .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 |
可选的表前缀,在运行时会添加到表名中:doc:查询构造器 <query_builder> 查询。这允许多个 CodeIgniter 安装共享一个数据库。 |
pConnect |
true/false (布尔值)- 是否使用持久连接。 |
DBDebug |
true/false (布尔值)- 数据库错误发生时是否抛出异常。 |
charset |
与数据库通信使用的字符集。 |
DBCollat |
与数据库通信使用的字符整理( |
swapPre |
一个默认的表前缀,应该与 |
schema |
数据库模式,默认值因驱动而异。( |
encrypt |
是否使用加密连接。
|
compress |
是否使用客户端压缩( |
strictOn |
true/false (布尔值)- 是否强制“严格模式”连接,有助于开发应用程序时确保严格的 SQL ( |
port |
数据库端口号。 |
foreignKeys |
true/false (布尔值)- 是否启用外键约束( 重要 SQLite3 外键约束默认关闭。 请参阅 SQLite 文档。 要实施外键约束,请将此配置项设置为 true。 |
busyTimeout |
毫秒(int) - 表锁定时休眠指定时间( |
备注
根据你使用的数据库驱动程序(MySQLi
、Postgre
等),并非所有的值都是必需的。例如,在使用 SQLite3
时,你不需要提供用户名或密码,数据库名称将是数据库文件的路径。