drupal啓動過程

switch ($current_phase) {
        case DRUPAL_BOOTSTRAP_CONFIGURATION:
          _drupal_bootstrap_configuration();
          break;

  1. 初始化配置php

  #設置drupal的錯誤和異常處理機制
  set_error_handler('_drupal_error_handler');
  set_exception_handler('_drupal_exception_handler');
  #初始化php環境
  drupal_environment_initialize();
  #標記頁面開始執行時間
  timer_start('page');
  #初始化配置包括settings.php文件裏面的設置
  #小技巧:最好在settings.php文件裏面設置$cookie_domain = '.example.com';
  #這樣避免執行過多代碼
  #設置session name源碼
  #$prefix = ini_get('session.cookie_secure') ? 'SSESS' : 'SESS';
  #session_name($prefix . substr(hash('sha256', $session_name), 0, 32));
  drupal_settings_initialize();

case DRUPAL_BOOTSTRAP_PAGE_CACHE:
          _drupal_bootstrap_page_cache();
          break;

  2.設置頁面緩存並試圖找到當前頁面是否已經被緩存css

require_once DRUPAL_ROOT . '/includes/cache.inc';
  #判斷drupal緩存機制是否被更改,例如換成memcache或者redis或者其餘
  #memcache模塊設置有
  #$conf['cache_backends'][] = 'sites/all/modules/memcache/memcache.inc';
  #$conf['cache_default_class'] = 'MemCacheDrupal';
  #設置form表單用的緩存在第三方緩存不存在時依舊能夠使用,因此須要將form表單的緩存交給數據庫
  #$conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
  #若是設置使用了第三方緩存必需要設置$conf['page_cache_without_database']這個爲true才能使用第三方緩存
  #跳過使用mysql數據庫,另外$conf['page_cache_invoke_hooks']設爲false表示再也不使用鉤子hook_boot,
  #hook_exit不然會報錯由於後面會用到module_list這個時候找不到這個方法。
  #$conf['page_cache_without_database'] = TRUE;
  #$conf['page_cache_invoke_hooks'] = FALSE;
  foreach (variable_get('cache_backends', array()) as $include) {
    require_once DRUPAL_ROOT . '/' . $include;
  }
  // Check for a cache mode force from settings.php.
  if (variable_get('page_cache_without_database')) {
    $cache_enabled = TRUE;
  }
  else {
    drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES, FALSE);
    $cache_enabled = variable_get('cache');
  }
  #判斷用戶ip是否已經被禁止
  drupal_block_denied(ip_address());
  #判斷是否登陸 若是是遊客則讀取頁面緩存
  if (!isset($_COOKIE[session_name()]) && $cache_enabled) {

case DRUPAL_BOOTSTRAP_DATABASE:
          _drupal_bootstrap_database();
          break;

3.初始化數據庫以及自動加載所須要的類
mysql

require_once DRUPAL_ROOT . '/includes/database/database.inc';
#註冊自動加載類和接口的方法
#標註drupal的類和接口文件在數據庫表registry裏面,同時表registry_file對文件是否變化作了hash處理
#應該是在開始模塊的時候存到數據表的
#當使用某個類或者某個接口的時候drupal會自動啓動drupal_autoload_class或者drupal_autoload_interface
#去查找類或者接口去驗證是否存在
spl_autoload_register('drupal_autoload_class');
spl_autoload_register('drupal_autoload_interface');

case DRUPAL_BOOTSTRAP_VARIABLES:
          _drupal_bootstrap_variables();
          break;

4.加載系統變量和全部開啓的模塊redis

global $conf;
#初始化鎖系統
require_once DRUPAL_ROOT . '/' . variable_get('lock_inc', 'includes/lock.inc');
lock_initialize();
#加載數據庫中的變量並不覆蓋settings.php文件裏變量的覆蓋
$conf = variable_initialize(isset($conf) ? $conf : array());
#加載 bootstrap 模塊. 在表system中bootstrap 等於 1的。
#目前本身裝的項目只有dblog,overlay,devel 3個模塊
require_once DRUPAL_ROOT . '/includes/module.inc';
module_load_all(TRUE);

case DRUPAL_BOOTSTRAP_SESSION:
          require_once DRUPAL_ROOT . '/' . variable_get('session_inc', 'includes/session.inc');
          drupal_session_initialize();
          break;

5.初始化session,開啓sessionsql

#設置本身的session處理機制
session_set_save_handler('_drupal_session_open', '_drupal_session_close', '_drupal_session_read', '_drupal_session_write', '_drupal_session_destroy', '_drupal_session_garbage_collection');
$GLOBALS['lazy_session'] = TRUE;
$user = drupal_anonymous_user();
#遊客用session_id(drupal_random_key());生成session_id 若是針對登陸用戶則用
#drupal_session_regenerate()生成session_id前者比後者效率高,但安全性略差。
#若是是https協議即便是遊客也開啓cookie
session_id(drupal_random_key());
if ($is_https && variable_get('https', FALSE)) {
      $insecure_session_name = substr(session_name(), 1);
      $session_id = drupal_random_key();
      $_COOKIE[$insecure_session_name] = $session_id;
}

case DRUPAL_BOOTSTRAP_PAGE_HEADER:
          _drupal_bootstrap_page_header();
          break;

6.引入鉤子hook_boot 及輸出頭部數據庫

 case DRUPAL_BOOTSTRAP_LANGUAGE:
          drupal_language_initialize();
          break;

7.初始化多語言加載鉤子bootstrap_invoke_all('language_init');bootstrap

case DRUPAL_BOOTSTRAP_FULL:
          require_once DRUPAL_ROOT . '/includes/common.inc';
          _drupal_bootstrap_full();
          break;

8.完整初始化 緩存

  引入路徑(path)文件,引入模板(theme)文件,引入分頁(pager)文件,引入菜單(menu)文件,引入分頁(pager)文件等引入鉤子module_invoke_all('init');安全

hook_init鉤子主要用於模塊引入本身的css文件cookie

function system_init() {
  $path = drupal_get_path('module', 'system');
  // Add the CSS for this module. These aren't in system.info, because they
  // need to be in the CSS_SYSTEM group rather than the CSS_DEFAULT group.
  drupal_add_css($path . '/system.base.css', array('group' => CSS_SYSTEM, 'every_page' => TRUE));
相關文章
相關標籤/搜索