发布于 2015-01-14 02:23:10 | 349 次阅读 | 评论: 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));


最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务