2017-09-20

猎数博客

数据挖掘,机器学习

drupal 6源码阅读(2)

作者:江航 / 2011-06-20 / (阅读 1,798 次) /



现在开始看第一个函数drupal_bootstrap

对下面的这些值,依次调用_drupal_booststrap. 这里需要对这些值进行一些解释。根据文件bootstrap.inc中的注释,先有个大体概念,注释在每个变量的后面

  1. DRUPAL_BOOTSTRAP_CONFIGURATION   : 初始化配置
  2. DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE : 试着通过数据库无关的缓存来获取数据
  3. DRUPAL_BOOTSTRAP_DATABASE,    初始化数据库层
  4. DRUPAL_BOOTSTRAP_ACCESS,   识别和拒绝那些禁止的主机访问   
  5. DRUPAL_BOOTSTRAP_SESSION,    初始化会话(session)处理
  6. DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE,   加载bootstrap.inc和module.inc, 开始变量系统并试着从缓存里面生成页面  
  7. DRUPAL_BOOTSTRAP_LANGUAGE,    识别当前页面的语言    
  8. DRUPAL_BOOTSTRAP_PATH,   将$_GET[‘q’]设置成请求的drupal path         
  9. DRUPAL_BOOTSTRAP_FULL        drupal完全载入,验证和修复输入数据

从这里的解释来看,第六步是加载模块,第三步加载数据库层,第四步加载权限层,加上在index.php中的模板层,目前还不清楚的是菜单和块层在哪里加载的(看起来像是index.php中的第二个函数menu_exeute_active_handler)。接着往下看。

  1. DRUPAL_BOOTSTRAP_CONFIGURATION
    将一些缺省全局变量全部清空。看来drupal将自己来处理这些缺省的全局变量。启动计时。然后是函数conf_init,这个函数加载了setting.php,然后设置了base URL, cookie domain和session name。其中的setting.php中包含了数据库的连接字以及网站的baseurl。
  2. DRUPAL_BOOTSTRAP_EARLY_PAGE_CACHE
    引入./includes/cache.inc, 调用page_cache_fastpath(),初步判断,这里就有可能从cache中返回一个页面。
  3. DRUPAL_BOOTSTRAP_DATABASE
    引入database.inc,根据setting.php中的连接字链接数据库,引入lock.inc,初始化locking system (?)
  4. DRUPAL_BOOTSTRAP_ACCESS
    查询数据库,看当前host是否被禁止访问。如被禁止,则退出
  5. DRUPAL_BOOTSTRAP_SESSION
    引入session.inc ,启动session
  6. DRUPAL_BOOTSTRAP_LATE_PAGE_CACHE
    初始化全局变量$conf,$conf数据是从数据库或者cache过来,但是还不明白这里数据库中的变量是什么时候插进去的。可能是什么时候setting.php中的数据被插入到数据库了,还不确定。如果cache启用,到cache中去找当前页面,如果没找到或者没启用cache,那么引入module.inc,调用bootstrap_invoke_all(‘boot’)。注意这个函数,估计是各个module中的函数就是在这里调用的,他看上去像一个hook。在没有cache的情况下,接下来调用drupal_page_header();返回页头。如果有cache的话,在cache中得到页头,然后就调用exit hook了。这里有点奇怪,还只显示了页头就exit,难道exit hook中会显示页面文件??源代码贴在这里先:
// Initialize configuration
    variables, using values from settings.php if available.
           $conf = variable_init(isset($conf) ? $conf : array());
           $cache_mode = variable_get(‘cache’, CACHE_DISABLED);
           // Get the page from the cache.
           $cache = $cache_mode == CACHE_DISABLED ? ” :
    page_get_cache();
           // If the skipping of the bootstrap hooks is not enforced,
    call hook_boot.
           if (!$cache || $cache_mode != CACHE_AGGRESSIVE) {
             // Load module handling.
             require_once ‘./includes/module.inc’;
             bootstrap_invoke_all(‘boot’);
           }
           // If there is a cached page, display it.
           if ($cache) {
             drupal_page_cache_header($cache);
             // If the skipping of the bootstrap hooks is not enforced,
    call hook_exit.
             if ($cache_mode != CACHE_AGGRESSIVE) {
               bootstrap_invoke_all(‘exit’);
             }
             // We are done.
             exit;
           }
           // Prepare for non-cached page workflow.
           drupal_page_header();
           break;
  1. DRUPAL_BOOTSTRAP_LANGUAGE
    先简单的理解为确定当前页面的语言,具体怎么确定的后面再看。
  2. DRUPAL_BOOTSTRAP_PATH
    引入path.inc,调用drupal_init_path。设置$_GET[‘q’]=drupal path
  3. DRUPAL_BOOTSTRAP_FULL       
    引入common.inc, 调用_drupal_bootstrap_full(); 这是一个内容丰富的函数,引入了theme.inc,pager.inc,menu,inc,tablesort.inc,file.inc,unicode.inc,image.inc,form.inc,mail.inc,actions.inc. 然后调用了module_load_all函数来加载所有启用的module。然后调用hook module_invoke_all(init).  加载module过程是查找module目录下的文件的过程。module_invoke_all调用hook的过程就是在每个module中查找hook函数是否调用。如果有则调用之,然后merge返回值。具体怎么merge的还不清楚。大体概念就是这样了。

到现在为止,所有的module都已经加载了,然后调用所有module的init函数。



本文地址: http://www.bagualu.net/wordpress/archives/1024 转载请注明






相关文章

  • drupal hook_menu和添加一个新页面( 2,883 )
  • 用debug_backtrace来打印drupal中theme函数的调用堆栈( 2,233 )
  • drupal源码阅读方法( 2,146 )
  • drupal 6.20 安装时register_globals问题( 2,037 )
  • drupal6中theme处理流程小结( 1,888 )
  • 怎样清除drupal cache( 1,883 )
  • drupal6中的theme函数及主题结构( 1,840 )
  • 继续看theme之page( 1,818 )
  • drupal 6源码阅读(2)( 1,798 )
  • drupal 6源码阅读(1)( 1,791 )
  • Leave a Reply

    您必须登录以发表评论,

    沪ICP备11036560号
    联系我: jianghang at bagualu.net