定义一个数据库连接的意思主要是通过在 settings.php 里对 $databases 数组进行配置。正如它的名字所表达的,$databases 允许定义多个数据库连接。它也支持定义多个目标(targets)一个数据库连接不会被开启(指的是连接对象不会被创建),除非一些代码首次尝试对那个数据库执行查询语句。
连接关键字(key)
一个连接关键字是对一个数据库连接的唯一标识。连接关键字对一个站点来说必须是唯一的,并且必须要有一个 default 连接作为主要Drupal数据库。对大多数站点来说,default 连接就是需要定义的唯一的连接。
连接目标(target)
一个连接关键字必须要设置一个或多个目标。一个目标是指一个可选的供替代的数据库,可能会在可用时被使用。如果请求的目标未定义,系统将会静默的退回到 default 目标,default 总是必须被定义的。
目标的主要用途是做数据库的主/从复制。default 目标是主服务器,然后可以定义一个或多个 slave 目标。查询将会尝试使用从服务器,也就是访问 slave 目标。如果可用,则对应的连接将被打开,查询将走从服务器,如果不可用,则查询将走 default 主服务器作为替代。这实现了一个透明回退的效果。所以我们的代码可以在从服务器可用时用从服务器,不可用时不需要做任何修改,代码仍然可以正常执行。
$databases 变量语法结构
$databases 数组是一个至少3层的嵌套数组。第一层定义了数据库连接关键字。第二层定义了数据库连接目标。每个连接目标设置的是对指定关键字/目标的连接信息。一些例子将会让你理解的更清晰。
<?php
$databases['default']['default'] = array(
'driver' => 'mysql',
'database' => 'drupaldb',
'username' => 'username',
'password' => 'secret',
'host' => 'localhost',
);
?>上面的 $databases 数组定义了一个单独的连接关键字 default。以及一个单独的连接目标 defaut。这个数据库连接使用了一个本地MySQL数据库(根据 driver 键),名字是 drupaldb,以及连接的用户名和密码。上面的例子就是Drupal安装在单个SQL服务器的典型设置,这对于大多数网站来说足够了。
对于主从配置,可以像下面一样来定义:
<?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 键是一个数组。如果任何目标被定义成连接信息的一个数组。那么,对于一个页面请求来讲,所有的查询可能会被发送到 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数据库和一个额外的数据库,命名为 extra,其使用 SQLite。注意 SQLite 连接信息结构上与MySQL的不同。每一个驱动由可能有不同的适合它们的配置方式。
注意,不管定义了多少连接,Drupal将不会开启一个到数据库的连接,知道真正被使用的时候。
因为PHP的PDO库被Drupal的数据库层依赖,你需要在选购主机时考虑到购买包含PDO扩展的运行环境。
PDO的配置项和驱动特定的配置项可以在数据库配置数组的 pdo 键下被定义。例如:
<?php
$databases['default']['default'] = array(
'driver' => 'mysql',
'database' => 'drupaldb',
'username' => 'username',
'password' => 'secret',
'host' => 'dbserver1',
'pdo' => array(ATTR_TIMEOUT => 2.0, MYSQL_ATTR_COMPRESS => 1),
);
?>