一/091
Drupal 5.x 代码分析(一)
鉴于drupal的强大功能,以及其在php界的高级应用和优雅的框架性质,本人决定抽时间分析drupal的核心文件,一来弥补php知识,二来学习drupal的设计思想,三来提高下程序设计能力和技巧,既然收益颇多,马上行动。
今天先看了看index主文件和bootstrap.inc文件。
index.php没有什么说的,主要功能除了响应菜单回调和包含页面底部信息之外,就下面2行
require_once ‘./includes/bootstrap.inc’;
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
所以主要看了看bootstrap.inc这个文件。
首先是一大堆常量定义,主要看了这几个常量,在代码中注释很详细。
* DRUPAL_BOOTSTRAP_CONFIGURATION: initialize configuration.
* DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE: try to call a non-database cache fetch routine.
* DRUPAL_BOOTSTRAP_DATABASE: initialize database layer.
* DRUPAL_BOOTSTRAP_ACCESS: identify and reject banned hosts.
* DRUPAL_BOOTSTRAP_SESSION: initialize session handling.
* DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE: load bootstrap.inc and module.inc, start the variable system and try to serve a page from the cache.
* DRUPAL_BOOTSTRAP_PATH: set $_GET['q'] to Drupal path of request.
* DRUPAL_BOOTSTRAP_FULL: Drupal is fully loaded, validate and fix input data.
这8个drupal系统加载阶段分别申明为8个系统常量,每个阶段执行该阶段的特定功能,如果直接加载其中的某个阶段,那么该阶段之前的也会加载。比如我们要自己脱离drupal系统写一个脚本用来和drupal的DB进行交互,但我们又想使用drupal的DB层,这时我们可以首先把bootstrap.inc包含进来,然后执行drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE)。
具体控制这个启动阶段的函数为:
function drupal_bootstrap($phase) {
static $phases = array(DRUPAL_BOOTSTRAP_CONFIGURATION, DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE, DRUPAL_BOOTSTRAP_DATABASE, DRUPAL_BOOTSTRAP_ACCESS, DRUPAL_BOOTSTRAP_SESSION, DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE, DRUPAL_BOOTSTRAP_PATH, DRUPAL_BOOTSTRAP_FULL);
while (!empty($phases) && $phase >= $phases[0]) {
$current_phase = array_shift($phases);
_drupal_bootstrap($current_phase);
}
}
该函数首先将8个启动阶段常量组织为一个静态数组,然后根据传递进来的当前阶段常量进行循环,从第一个阶段开始一直循环到传递进来的阶段。因为每次循环都会array_shift,一直到传递进来的阶段为目前阶段。每次循环执行一次内部函数,这样可以为每个阶段执行相应的操作了。这个就是drupal的启动控制流程了,没有什么特别新颖的。
此外,这个文件涉及很多关于路径,配置,缓存信息的初始化过程。drupal系统中使用最方便的variable_get和variable_set函数也是在这个文件中定义的。
function variable_set($name, $value) {
global $conf;
db_lock_table(’variable’);
db_query("DELETE FROM {variable} WHERE name = ‘%s’", $name);
db_query("INSERT INTO {variable} (name, value) VALUES (’%s’, ‘%s’)", $name, serialize($value));
db_unlock_tables();
cache_clear_all(’variables’, ‘cache’);
$conf[$name] = $value;
}
临时在系统中存储的键值对在数据库中存储后,将键值放在conf全局数组中,这样variable_get即可获取到了。此外,表单提交后的回显函数drupal_set_message也在这里有定义,很简单,这里就不做说明了。
接下来还有匿名用户的用户对象初始化函数。
function drupal_anonymous_user($session = ”) {
$user = new stdClass();
$user->uid = 0;
$user->hostname = $_SERVER['REMOTE_ADDR'];
$user->roles = array();
$user->roles[DRUPAL_ANONYMOUS_RID] = ‘anonymous user’;
$user->session = $session;
$user->cache = 0;
return $user;
}
安全方面,有对HTTP_HOST的处理,
$_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
return preg_match(’/^\[?(?:[a-z0-9-:\]_]+\.?)+$/’, $_SERVER['HTTP_HOST']);
加上一些时间相关函数,今天就看了这么多。下次主要看缓存部分和其相关的文件,cache.inc
01:06 on 一月 19th, 2009
好文章啊,随时关注,博主要更新快点啊。