在 Drupal 7 中操作数据库 - 第2课 - 数据库配置(Configuration)
在 Drupal 中,定义数据库连接的主要方式是通过 settings.php 文件中的 $databases
数组。顾名思义,$databases
允许定义多个数据库连接,并且支持多目标配置(target)。数据库连接在第一次执行查询时才会被真正建立(即延迟加载)。
连接键(Connection Key)
连接键是数据库连接的唯一标识符。它在整个网站范围内必须唯一,并且必须为主数据库设置一个默认连接键。通常,大多数站点只会有一个默认连接。
连接目标(Connection Target)
每个连接可以包含一个或多个“目标(target)”。目标是一种可选机制,用于在可用时使用不同的数据库。若所请求的目标未定义,系统会自动回退到默认目标(“default”),而默认目标必须始终存在。
这种设计通常用于实现主从复制(master/slave replication)。默认情况下,查询会发送到主数据库(master)。但如果定义了一个或多个 “slave” 目标,那么标记为可在从库执行的查询将优先尝试使用从服务器。如果无法连接,则回退到主服务器。
$databases 数组语法
$databases
是一个三维嵌套数组。第一层是连接键,第二层是连接目标,第三层是具体的连接配置(如驱动、用户名、主机等)。下面是一个示例:
<?php $databases['default']['default'] = array( 'driver' => 'mysql', 'database' => 'drupaldb', 'username' => 'username', 'password' => 'secret', 'host' => 'localhost', ); ?>
上面的配置定义了一个名为 “default” 的数据库连接和目标(default/default)。它使用 MySQL 驱动,连接到本地主机(localhost)上的 “drupaldb” 数据库,使用用户名 “username” 和密码 “secret”。这是最常见的单数据库站点配置。
主从(Master/Slave)配置示例
<?php $databases['default']['default'] = array( 'driver' => 'mysql', 'database' => 'drupaldb1', 'username' => 'username', 'password' => 'secret', 'host' => 'dbserver1', ); $databases['default']['slave'][] = array( 'driver' => 'mysql', 'database' => 'drupaldb2', 'username' => 'username', 'password' => 'secret', 'host' => 'dbserver2', ); $databases['default']['slave'][] = array( 'driver' => 'mysql', 'database' => 'drupaldb3', 'username' => 'username', 'password' => 'secret', 'host' => 'dbserver3', ); ?>
该配置定义了一个主服务器(default)和两个从服务器(slave)。注意,slave
是一个数组,这意味着如果定义了多个从库,Drupal 会在每次页面加载时随机选择一个从库来执行查询。这意味着一次页面请求中的查询可能全部发往 dbserver2
或 dbserver3
。
多数据库配置示例
<?php $databases['default']['default'] = array( 'driver' => 'mysql', 'database' => 'drupaldb1', 'username' => 'username', 'password' => 'secret', 'host' => 'dbserver1', ); $databases['extra']['default'] = array( 'driver' => 'sqlite', 'database' => 'files/extradb.sqlite', ); ?>
此配置定义了一个主 Drupal MySQL 数据库和一个名为 “extra” 的附加 SQLite 数据库。请注意,SQLite 的连接信息结构与 MySQL 不同。每种数据库驱动都有自己特定的配置参数。
Drupal 支持任意数量的数据库连接,但不会自动建立连接,除非在代码中显式使用该数据库(例如使用 Database::getConnection('extra')
)。
Drupal 7 需要 PDO 支持
Drupal 7 强制要求 PHP PDO 扩展。因此,你必须确保服务器启用了 PDO 扩展,或选择支持 PDO 的主机环境,否则 Drupal 将无法连接数据库。