发布于 2015-01-14 02:23:10 | 355 次阅读 | 评论: 0 | 来源: PHPERZ
Drupal开源内容管理框架
Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。
本文为大家讲解的是drupal启动过程分析说明,Drupal是使用PHP语言编写的开源内容管理框架(CMF)感兴趣的同学参考下。
drupal简介
Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成。连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。
switch ($current_phase) {
case DRUPAL_BOOTSTRAP_CONFIGURATION:
_drupal_bootstrap_configuration();
break;
初始化配置
#设置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.设置页面缓存并试图找到当前页面是否已经被缓存
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.初始化数据库以及自动加载所需要的类
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.加载系统变量和所有开启的模块
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,开启session
#设置自己的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');
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文件
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));