You are here

6 变量阶段

admin 的头像
Submitted by admin on 星期四, 2015-07-23 10:08

作者:老葛,北京亚艾元软件有限责任公司,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一列。

1.png 

凡是这里bootstrap的值为1的模块,都会在module_load_all(TRUE)的时候加载进来。哪些模块的bootstrap的值为1呢? 

 

 

2.png 

默认只有这么两个模块。我当时还想着比如systemuser模块会被加载进来,没有想到是这两个模块。


Drupal版本: