You are hereDrupal的工作原理(资料搜集)
Drupal的工作原理(资料搜集)
人工翻译:葛红儒 Eskalate 科技公司
资料来自互联网及drupal官方wiki
在这一章,我们为你给出一个 Drupal 的概貌。关于系统的每一部分如何工作的详细信息将在以后章节中介绍。在这里,我们将涉及到 Drupal 运行所用到的技术堆栈,构成 Drupal 的各个文件,和各种不同的概念术语,比如节点、钩子、区块和主题。
什么是Drupal?
Drupal 是用作建设网站的。它是一个高度模块化,开源的 web 内容管理框架,它重点建立在合作之上的。它是一个可扩展的,适应标准的,并努力保持简洁代码和较小脚 本的系统。Drupal 发布版中包含基本的核心功能,其他的额外功能可通过安装模块来获得。Drupal 被设计为可被定制的,但是定制是通过覆写核心功能或者增加模块来完成的,而不是修改核心组件中的代码。它同样成功的将内容管理和内容表示两者分离。
Drupal 可以被用来建立一个 Internet 门户;一个个人的、部门的或者公司的网站;一个电子商务站点;一个资源分类站点;一个在线报纸;一个图库;一个内部网,这里仅提到了一部分。它甚至可被用来教授一个远程学习课程。一个专注于安全方面的小组,通过对威胁的反应和发行安全更新来保证 Drupal 的安全性。还有一个繁荣的社区组织,包括用户、 站点管理员、设计者和 web 开发者,非常努力的工作着,以持久的改进软件。可参看 http://drupal.org 和 http://groups.drupal.org。
技术堆栈(Technology Stack)
Drupal 的设计目标是既可以运行在廉价的 Web 主机上,也可以适应大量运算的分布式站点。前一目标意味着使用最流行的技术,而后者则意味着仔细的严格的编码。Drupal 的技术堆栈如图1-1所示。

图1-1 Drupal 的技术堆栈
操作系统位于技术堆栈的最底层,Drupal 可以不用太关注这一层。在任何支持 PHP 的操作系统上都可以成功的运行 Drupal。
Drupal 最常用的 web 服务器是 Apache,当然也可以使用其它的 web 服务器(包括微软的 IIS)。由于 Drupal 和 Apache 的这种长期的友好关系,所以在 Drupal 的根目录自带了一个 .htaccess 用来确保 Drupal 安装的安全性(如果你使用的是一个其它的 web 服务器,而不是 Apache,你一定要将 .htaccess 中的规则转化为你系统可以理解的语句)。可以使用 Apache 的 mod_rewrite 模块来实现简洁链接(Clean URLs)- 将 URL 中的“?”、“&”以及其它奇怪的符号清除掉,在 Drupal 中去掉的是“?q=”。这一点特别重要,当从其他的内容管理系统或者静态文件中迁移到 Drupal 上时,依照 Tim Berners-Lee(http://www.w3.org/Provider/Style/URI),内容的 URL 不需要改变,而不改变的 URIs 则非常酷。
Drupal 使用一个轻量级的数据库抽象层与堆栈的下一层次(数据库层)进行交互。这一抽象层处理 SQL 查询语句的清洁工作,并使得可以使用不同厂商的数据库而不用重构你的代码。在 Drupal 中最常用的数据库是 MySQL 和 PostgreSQL。
Drupal 使用的编程语言是 PHP。PHP 的名声比较坏,这是因为 PHP 比较好学,这样大量的 PHP 代码都是由新手编写的。和许多其它的编程语言一样,PHP 也常被滥用或者用于快速实现的系统中。然而,也可以用 PHP 来编写可靠的代码。所有的 Drupal 内核代码都严格的遵守了编码规范(http://drupal.org/node/318)。
内核(Core)
Drupal 的内核有一个轻量级的框架组成。当你从 drupal.org 下载 Drupal 时就得到了这一内核。它负责提供基本的功能用以支持系统的其它部分。
内核包括当 Drupal 接到请求时所要调用的系统引导指令的代码,一个 Drupal 常用函数库和提供基本功能的模块,比如用户管理、分类和模板,如图1-2所示。

图1-2 Drupal内核的概貌(没有展示完所有的核心功能)
后台管理接口(Administrative Interface)
Drupal 的后台管理接口与站点的其它部分紧密的集成在了一起,而且默认情况下,使用相同的主题。第一个用户,也就是用户 id 为 1 的用户,是一个对站点拥有完全权限的超级用户。 以用户1的身份登录后,你将在你的用户区块(参看“区块”部分)中看到管理站点的一个链接。点击这一链接,你将进入到 Drupal 的后台管理接口页面。根据用户对站点访问权限的不同,每个用户的区块都会有一个不同的链接。
模块(Modules)
Drupal 是一个完全模块化的框架。功能都包含在模块中,而模块可以被启用或者禁用(一些必须的模块不能被禁用)。来向 Drupal 站点添加特性有3种方式:启用已存在的模块(核心模块),安装 Drupal 社区成员编写的模块(第3方模块),编写自己的模块。这样,就可以根据站点的需要来添加相应的模块,需要的功能少,所需的模块也就少,需要很多功能,就添加多一些的模块。如图1-3所示。

图1-3 通过启用其它的模块来添加更多的功能
新添的内容类型比如日志或者文件,新添的行为比如 e-mail 通知、P2P 发布和聚合,等等都是通过模块实现的。Drupal 使用了反转控制(inversion of control)设计模式,框架只在合适的时间调用相应的模块功能。这些为了模块完成它们的任务提供的机会被称为钩子。
钩子(Hooks)
可以把钩子看做 Drupal 的内部事件。它们也被称为回调函数,这是由于他们是根据函数命名约定来构建的,而不是注册一个事件监听器(listener),它们也不是真的被回调。模块使用钩子挂在 Drupal 的其余部分上。
假定一个用户登录到了你的 Drupal 站点上。在用户登录时,Drupal 调用用户钩子。这意味将调用所有的根据约定 - “模块名”+“钩子名” - 创建的函数都将被调用。例如,评论模块中的 comment_user (),本地化模块中的 locale_user(),节点模块中的 node_user(),还有任何其它具有类似名称的函数都将被调用。如果你编写了一个名为 spammy.module 的定制模块,其中包含一个名为 spammy_user() 的用来向用户发送 e-mail 的函数,那么你的这个函数也将被调用,倒霉的用户每次登录都将收到一封不请自来的 e-mail。
接近 Drupal 的核心功能的最常用的方式就是在模块中实现钩子。
提示:更多关于 Drupal 所支持的钩子的信息,参看在线文档 http://api.drupal.org/api/5,并查看“Drupal的组成部分”(Components of Drupal),接着“模块系统<Drupal 钩子>”(Module system <Drupal hooks>)。
主题(Themes)
当创建一个发送给浏览器的 web 页面时,实际主要考虑两点:聚集合适的数据和为 web 装饰这些数据。在 Drupal 中,主题层负责创建浏览器接收到的 HTML。Drupal 可以使用多种流行的模板方式,比如 Smarty,PHP 的模板属性语言(Template Attribute Language for PHP <PHPTAL>)和 PHPTemplate。
这里需要记住的重点是 Drupal 提倡将内容和显示分开。
在 Drupal 中可以使用多种方式来为你的网站定制外观。最简单的方式是使用 CSS 来覆盖 Drupal 内置的 class 和 id。然而,如果你不想局限于此,并且想定制实际的 HTML 输出时,你将发现很容易就可以达到你的目的。Drupal 的模板文件有标准的 HTML 和 PHP 组成。另外,Drupal 页面的每个动态部分(比如盒子、列表或者面包屑),都可以通过声明一个具有合适名字的函数来覆盖掉。接着,Drupal 将使用你声明的函数。
节点(Nodes)
Drupal 中的内容类型都根源于一个称为节点的单独的基本类型。无论它是一篇日志或者甚至一个工程任务,它的底层数据结构都是相同的。这一方式背后的优势是它的扩展性。模块开发者可以为节点添加特性比如级别、评论、文件附件、地理位置信息等等,而不用担心节点的类型,无管它是日志还是其它。站点管理员可以根据内容类型混合和匹配功能,例如在日志而不是在页面上启用评论,或者仅为工程任务启用文件上传功能。
节点还包含了一个行为属性基本集,而所有其他的内容类型都继承了这一基本集。任何节点都可以被提升到首页、发布或者未发布,或者甚至被搜索。而且由于这个统一的结构,后台管理接口为节点提供了一个批量编辑的页面。
区块(Blocks)
区块是在你网站模板的特定位置可以启用或者禁用的信息。例如,一个区块可以展示你站点当前活跃用户数。你可能使用一个区块来展示最活跃的用户,或者即将来临的事件列表。区块一般放置在模板中的左右栏、页首或者页尾中。区块也可以用来展示特定类型的节点,一般仅用于首页,或者由于其它标准才这样做。
区块常常用于为当前用户展示定制的信息。例如,一个导航区块仅包含当前用户有权访问的链接。可以通过后台管理接口页面对区块的位置和显示进行管理。
文件布局(File Layout)
理解默认 Drupal 安装的目录结构,能够帮助你调试你的站点,并教你一些重要的最佳实践,比如下载的模块和主题的放置位置,如何拥有不同的 Drupal 轮廓(profile)。一个 Drupal 默认安装的目录结构如图1-4所示。
文件夹目录中的每一元素的详解如下:
files:Drupal 默认不带有这个文件夹,但是如果你想使用一个定制的 logo,启用用户头像,或者在你的站点上上传其它媒体文件时,你需要这个文件夹。运行 Drupal 的 web 服务器需要具有对这个子目录进行读和写的权限。
includes:包含了 Drupal 常用的函数库。
misc:用来存储 JavaScript,和在 Drupal 安装中备用的各种图标和图片。
modules:包含所有的核心模块,其中每个模块位于它自己的文件夹下。最好不要乱动这个文件夹下面的任何东西(你添加的其他模块放到sites目录下)
profiles:包含一个站点的不同安装轮廓(profile)。如果在这个子目录下面,除了默认的轮廓(profile)以外,还有其它的轮廓(profiles),那么在你第一个安装 Drupal 站点时 Drupal 将向你询问想要安装哪一个轮廓(profile)。安装 profile 的主要目的是自动的启用核心的或者第3方的模块。比如一个电子商务轮廓(profile)的示例,它将自动把 Drupal 作为一个电子商务平台进行安装。
scripts:包含了许多脚本,这些脚本可用于检查语法,清洁代码,使用 cron 处理特定情况等等。在 Drupal 的请求生命周期中用不到它;里面有一些 shell 和 Perl 的有用脚本。
sites:包含了你对 Drupal 进行的修改,包括设置、模块、主题等形式(参看图1-5)。你从第3方模块库中下载的模块,或者你自己编写的模块,都放在 sites/all/modules 下面。这使得你对 Drupal 所进行的任何修改都保存在单个文件夹里。在目录 sites 下面有一个名为 default 的子目录用来放置你 Drupal 站点的默认配置文件 - settings.php。通常拷贝 default 目录并使用你站点的 URL 对其重命名,这样你的设置文件就位于 sites/www.example.com/settings.php。
themes:包含了 Drupal 的模板引擎和默认主题。

图1-4 Drupal安装的默认目录结构

图1-5 sites文件夹用来存储你的所有Drupal修改
对一个请求提供服务(Serving a Request)
当 Drupal 收到一个请求时都发生了什么,如果对此有一个概念上的框架,这对以后很有帮助,所以本部分将为这一框架提供一个快照。如果你自己也想追踪它的话,使用一个好的调试器,从 index.php 开始,Drupal 的大多数请求都从这里开始。对于展示一个简单 web 页面,这里所列的顺序看起来有些复杂,但这是灵活性所必需的。
Web 服务器的角色
Drupal 运行在一个 web 服务器上,通常是 Apache 上。如果 web 服务器识别 Drupal 的 .htaccess 文件,那么将初始化一些 PHP 设置,并启用简洁链接(clean URL)。
注意 Drupal 支持简洁链接(clean URL),也就是像 http://example.com/foo/bar 的一样的 URL。Drupal 的 .htaccess 文件中的 mod_rewrite 规则将这一路径转换为 index.php?q=foo/bar。所以在内部,无论是否启用了简洁链接(clean URL),Drupal 总是使用相同的路径(存储在 URL 查询参数 q 中)。在这里,内部路径应该为 foo/bar。内部路径也被称为 Drupal 路径。
在备选的 web 服务器中,比如微软的 IIS,可以使用一个 ISAPI 模块比如 ISAPI_Rewrite 来实现简洁链接。
引导指令流程(The Bootstrap Process)
对于每个请求,Drupal 通过一系列的引导指令阶段来引导它自己。这些阶段在 bootstrap.inc 中定义,接下来的部分描述了处理流程。
配置(Configuration)
在这一阶段将填充 Drupal 的内部配置数组,并建立站点的基础 URL($base_url)。通过 include_once() 来解析 settings.php 文件,任何已被覆盖的变量将被应用。
早期页面缓存(Early Page Cache)
当在需要更高的性能水平时,甚至在试图建立数据库连接之前可能就需要要调用缓存系统了。早期页面缓存阶段让你(使用 include() )包含一个含有名为 page_cache_fastpath() 的函数的 PHP 文件,该函数接收并返回内容给浏览器。通过将 page_cache_fastpath 变量设置为 TRUE,就可以启用早期页面缓存阶段了,而包含进来的文件是通过将 cache_inc 变量设置为文件的路径来定义的。
数据库(Database)
在数据库阶段期间,将决定数据库的类型,将建立初始链接以供数据库查询使用。
访问(Access)
Drupal 支持基于一个主机名一个 IP 地址来禁止主机(对站点的访问)。在访问阶段,将快速的检查请求是否来自一个被禁的主机;如果是,那么将拒绝访问。
会话(Session)
Drupal 利用了 PHP 内置的会话处理,但是它使用它自己的基于数据库的会话处理器来覆盖 PHP 的一些处理器。在会话阶段,将初始化或者重新构建会话。
后期页面缓存(Late Page Cache)
在后期页面缓存阶段,Drupal 加载足够的支持代码来决定是否需要从页面缓存中提供一个页面。这包括,把来自于数据库的设置合并到在配置阶段创建的数组中,加载或者解析模块代码。如果在会话中显示请求来自于匿名用户并且启用了页面缓存,那么将从缓存中返回页面,执行到此停止。
路径(Path)
在路径阶段,将加载处理路径和路径别名的(aliasing)的代码。该阶段使得用户可读的 URL 被转化为 Drupal 路径,并处理内部 Drupal 路径的缓存和查询操作。
完整(Full)
该阶段是引导指令的最后一个阶段,它包括加载一个通用函数库,主题支持,和支持回调映射,文件处理,Unicode,PHP图片工具集,表单的创建和处理,自动排序的表格,和结果集的分页。在这里将设置 Drupal 定制的的错误处理器,设置本地化,并加载所有启用了的模块。最后 Drupal 调用 init 钩子,这样在对请求正式开始处理以前,将有机会通知相应的模块。
一旦 Drupal 的整个引导指令完成了,那么框架中的所有部分现在都可以使用了。现在是时候获得浏览器的请求并将它委托给一个处理它的函数。在 URLs 和处理它们的函数之间的映射,是使用一个回调登记来完成的,这个回调登记负责 URL 映射和访问控制。模块使用菜单钩子来注册它们的回调函数(更多信息,参看第4章)
当 Drupal 为浏览器请求的 URL 找到一个存在的回调函数,并且用户有权访问该回调函数,那么控制权将转移给回调函数。
处理一个请求(Processing a Request)
回调函数做了流程要求做的事情,并收集满足请求所需要的数据。例如,收到一个对内容的请求比如 http://example.com/q=node/3,URL 将被映射到 node.module 里面的函数 node_page_view()。进一步的处理将从数据库中取回该节点的数据并将它放到一个数组中。接着,就到了主题化的时候了。
主体化数据(Theming the Data)
主体化涉及到将已被取回,操作或者创建的数据转化为 HTML。Drupal 将使用管理员选用的主题来为网页提供一个合适的外观,并将生成的 HTML 移交给 web 浏览器。
总结
读完本章后,你应该能大致理解 Drupal 的工作原理,并对当 Drupal 为一个请求服务时都发生了什么有个概念。组成网页服务处理流程的个部分将在后面章节中详细介绍。






专业性很大的文章,建议将这样长的文章分篇发布,比较好!