2.1 drupal_bootstrap

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

/**

 * Ensures Drupal is bootstrapped to the specified phase.

 *

 * In order to bootstrap Drupal from another PHP script, you can use this code:

 * @code

 *   define('DRUPAL_ROOT', '/path/to/drupal');

 *   require_once DRUPAL_ROOT . '/includes/bootstrap.inc';

 *   drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

 * @endcode

 *

 * @param $phase

 *   A constant telling which phase to bootstrap to. When you bootstrap to a

 *   particular phase, all earlier phases are run automatically. Possible

 *   values:

 *   - DRUPAL_BOOTSTRAP_CONFIGURATION: Initializes configuration.

 *   - DRUPAL_BOOTSTRAP_PAGE_CACHE: Tries to serve a cached page.

 *   - DRUPAL_BOOTSTRAP_DATABASE: Initializes the database layer.

 *   - DRUPAL_BOOTSTRAP_VARIABLES: Initializes the variable system.

 *   - DRUPAL_BOOTSTRAP_SESSION: Initializes session handling.

 *   - DRUPAL_BOOTSTRAP_PAGE_HEADER: Sets up the page header.

 *   - DRUPAL_BOOTSTRAP_LANGUAGE: Finds out the language of the page.

 *   - DRUPAL_BOOTSTRAP_FULL: Fully loads Drupal. Validates and fixes input

 *     data.

 * @param $new_phase

 *   A boolean, set to FALSE if calling drupal_bootstrap from inside a

 *   function called from drupal_bootstrap (recursion).

 *

 * @return

 *   The most recently completed phase.

 */

function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {

  // Not drupal_static(), because does not depend on any run-time information.

  static $phases = array(

    DRUPAL_BOOTSTRAP_CONFIGURATION,

    DRUPAL_BOOTSTRAP_PAGE_CACHE,

    DRUPAL_BOOTSTRAP_DATABASE,

    DRUPAL_BOOTSTRAP_VARIABLES,

    DRUPAL_BOOTSTRAP_SESSION,

    DRUPAL_BOOTSTRAP_PAGE_HEADER,

    DRUPAL_BOOTSTRAP_LANGUAGE,

    DRUPAL_BOOTSTRAP_FULL,

  );

  // Not drupal_static(), because the only legitimate API to control this is to

  // call drupal_bootstrap() with a new phase parameter.

  static $final_phase;

  // Not drupal_static(), because it's impossible to roll back to an earlier

  // bootstrap state.

  static $stored_phase = -1;

 

  // When not recursing, store the phase name so it's not forgotten while

  // recursing.

  if ($new_phase) {

    $final_phase = $phase;

  }

  if (isset($phase)) {

    // Call a phase if it has not been called before and is below the requested

    // phase.

    while ($phases && $phase > $stored_phase && $final_phase > $stored_phase) {

      $current_phase = array_shift($phases);

 

      // This function is re-entrant. Only update the completed phase when the

      // current call actually resulted in a progress in the bootstrap process.

      if ($current_phase > $stored_phase) {

        $stored_phase = $current_phase;

      }

 

      switch ($current_phase) {

        case DRUPAL_BOOTSTRAP_CONFIGURATION:

          _drupal_bootstrap_configuration();

          break;

 

        case DRUPAL_BOOTSTRAP_PAGE_CACHE:

          _drupal_bootstrap_page_cache();

          break;

 

        case DRUPAL_BOOTSTRAP_DATABASE:

          _drupal_bootstrap_database();

          break;

 

        case DRUPAL_BOOTSTRAP_VARIABLES:

          _drupal_bootstrap_variables();

          break;

 

        case DRUPAL_BOOTSTRAP_SESSION:

          require_once DRUPAL_ROOT . '/' . variable_get('session_inc', 'includes/session.inc');

          drupal_session_initialize();

          break;

 

        case DRUPAL_BOOTSTRAP_PAGE_HEADER:

          _drupal_bootstrap_page_header();

          break;

 

        case DRUPAL_BOOTSTRAP_LANGUAGE:

          drupal_language_initialize();

          break;

 

        case DRUPAL_BOOTSTRAP_FULL:

          require_once DRUPAL_ROOT . '/includes/common.inc';

          _drupal_bootstrap_full();

          break;

      }

    }

  }

  return $stored_phase;

}

在函数的注释里面,我们看到,Drupal的引导指令分为多个阶段,DRUPAL_BOOTSTRAP_FULL是最后一个阶段,启动Drupal引导指令的时候,可以指定具体的阶段,而不是仅仅限于最后这个阶段。

如果要在别的PHP脚本中,启动Drupal引导指令的话,可以使用下面的代码:

    define('DRUPAL_ROOT', '/path/to/drupal');

    require_once DRUPAL_ROOT . '/includes/bootstrap.inc';

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

 

我们来看函数里面的代码,首先是:

  static $phases = array(

    DRUPAL_BOOTSTRAP_CONFIGURATION,

    DRUPAL_BOOTSTRAP_PAGE_CACHE,

    DRUPAL_BOOTSTRAP_DATABASE,

    DRUPAL_BOOTSTRAP_VARIABLES,

    DRUPAL_BOOTSTRAP_SESSION,

    DRUPAL_BOOTSTRAP_PAGE_HEADER,

    DRUPAL_BOOTSTRAP_LANGUAGE,

    DRUPAL_BOOTSTRAP_FULL,

  );

这里面列出来了,引导指令的所有阶段,我们在think in Drupal的第一集里面,介绍过这些阶段。我们看到,这些阶段都是使用的大写字母,表示这是定义好的常量。在bootstrap.inc文件中,有这样的代码。

/**

 * First bootstrap phase: initialize configuration.

 */

define('DRUPAL_BOOTSTRAP_CONFIGURATION', 0);

 

/**

 * Second bootstrap phase: try to serve a cached page.

 */

define('DRUPAL_BOOTSTRAP_PAGE_CACHE', 1);

 

/**

 * Third bootstrap phase: initialize database layer.

 */

define('DRUPAL_BOOTSTRAP_DATABASE', 2);

 

/**

 * Fourth bootstrap phase: initialize the variable system.

 */

define('DRUPAL_BOOTSTRAP_VARIABLES', 3);

 

/**

 * Fifth bootstrap phase: initialize session handling.

 */

define('DRUPAL_BOOTSTRAP_SESSION', 4);

 

/**

 * Sixth bootstrap phase: set up the page header.

 */

define('DRUPAL_BOOTSTRAP_PAGE_HEADER', 5);

 

/**

 * Seventh bootstrap phase: find out language of the page.

 */

define('DRUPAL_BOOTSTRAP_LANGUAGE', 6);

 

/**

 * Final bootstrap phase: Drupal is fully loaded; validate and fix input data.

 */

define('DRUPAL_BOOTSTRAP_FULL', 7);

我们看到这些常量,从上到下,分别对应于01234567。引导指令共分为8个阶段。当我们明白了这些常量就是整数的时候,理解下面的这段代码,就很简单了。   

while ($phases && $phase > $stored_phase && $final_phase > $stored_phase) {

这句话的意思使用,如果传过来的阶段为7,那么系统将会从0开始,123456这样一直执行下去,直到执行到阶段7为止。如果传过来的阶段为3,那么将会执行0123。就是说,从0开始,一直执行到传递过来阶段为止。引导指令是按照先后顺序,依次执行的。


Drupal版本: