作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com
我们来看阶段3,也就是变量阶段,对应的代码:
case DRUPAL_BOOTSTRAP_VARIABLES:
_drupal_bootstrap_variables();
break;
Drupal将这个阶段要做的工作,委托给了_drupal_bootstrap_variables函数。这个函数就位于bootstrap.inc文件中,我们通过文本查找,很快就找到了这个函数的定义:
/**
* Loads system variables and all enabled bootstrap modules.
*/
function _drupal_bootstrap_variables() {
global $conf;
// Initialize the lock system.
require_once DRUPAL_ROOT . '/' . variable_get('lock_inc', 'includes/lock.inc');
lock_initialize();
// Load variables from the database, but do not overwrite variables set in settings.php.
$conf = variable_initialize(isset($conf) ? $conf : array());
// Load bootstrap modules.
require_once DRUPAL_ROOT . '/includes/module.inc';
module_load_all(TRUE);
}
首先是加载includes/lock.inc文件,并初始化锁系统。接着是变量的初始化,我们知道,Drupal中很多配置变量都是存放在variable表里面,这里的初始化,将会把这个表中的数据全部加载出来的,是的,整张表的数据。我们平时做开发的时候,不要在变量里面存储大数据,这是我们要注意的。
当我看到lock_initialize的时候,我当时想,我只知道Drupal里面有锁机制,但是从来不知道具体的用处。我今天在写文档的时候,顺着查看了一下API函数,也就是查看了一下variable_initialize函数,一下明白了锁机制的用法,同时也明白了为什么这里需要加载includes/lock.inc文件。
function variable_initialize($conf = array()) {
// NOTE: caching the variables improves performance by 20% when serving
// cached pages.
if ($cached = cache_get('variables', 'cache_bootstrap')) {
$variables = $cached->data;
}
else {
// Cache miss. Avoid a stampede.
$name = 'variable_init';
if (!lock_acquire($name, 1)) {
// Another request is building the variable cache.
// Wait, then re-run this function.
lock_wait($name);
return variable_initialize($conf);
}
else {
// Proceed with variable rebuild.
$variables = array_map('unserialize', db_query('SELECT name, value FROM {variable}')->fetchAllKeyed());
cache_set('variables', $variables, 'cache_bootstrap');
lock_release($name);
}
}
foreach ($conf as $name => $value) {
$variables[$name] = $value;
}
return $variables;
}
db_query负责将变量从数据库表中取出,array_map('unserialize',..)负责反序列化。lock_acquire尝试获取锁,获取失败就等待一下lock_wait;获取成功后,就释放锁lock_release。此外,我们看到,所有的变量都存放在一个大的数组里面,名值对。
module_load_all(TRUE),这句代码,负责加载引导指令阶段,需要加载的module文件。我们知道,Drupal启动后,会加载所有的module文件。不过在启动的过程中,也就是在引导指令阶段,就有一部分module文件被优先加载了进来。使用phpmyadmin打开Drupal的数据库,找到system表,打开这个表,我们看到这个表里面包含了bootstrap一列。
凡是这里bootstrap的值为1的模块,都会在module_load_all(TRUE)的时候加载进来。哪些模块的bootstrap的值为1呢?
默认只有这么两个模块。我当时还想着比如system、user模块会被加载进来,没有想到是这两个模块。