switch ($current_phase) { case DRUPAL_BOOTSTRAP_CONFIGURATION: _drupal_bootstrap_configuration(); break;
初始化配置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));