Drupal是如何工作的?[已关闭]

2022-08-30 06:44:39

有人可以提供Drupal 7控制流的架构概述吗?也许是关于如何生成页面的流程图。对于 Drupal 的工作原理,您还建议提供哪些其他资源咨询?


答案 1

Drupal在这方面可能会令人困惑,部分原因是它具有相对较深的函数堆栈。虽然它是程序式PHP,但它在其架构中纯粹是事件/侦听器驱动的,并且在主PHP脚本中没有简单的“流”供您查看。我最近做了一个关于这个主题的演讲,幻灯片张贴在幻灯片共享上,但快速的高级摘要可能会有所帮助。

  • Drupal的索引.php文件用作前端控制器。所有页面都通过管道传输,并且用户请求的“实际”url/路径将作为参数传递给索引.php。
  • Drupal的路径路由器系统(MenuAPI)用于将请求的路径与给定的插件模块相匹配。该插件模块负责构建页面的“主要内容”。
  • 一旦主页面内容被构建,index.php调用主题('page',$content),这会将内容传递给Drupal的设置/皮肤系统。在那里,它被包装在侧边栏/标题/小部件/等中。
  • 然后,呈现的页面被交还给apache,并被发送回用户的浏览器。

在整个过程中,Drupal和第三方插件模块正在触发事件,并监听它们做出响应。Drupal称之为“钩子”系统,它是使用函数命名约定实现的。例如,“blog”模块可以通过实现名为blog_user())的函数来拦截相关的“user”。在Drupal的说法中,这被称为hook_user()

它有点笨拙,但由于PHP的怪癖(它保留了所有加载函数的内部哈希表),它允许Drupal通过迭代已安装插件的列表来快速检查听众。对于每个插件,它可以在适当命名的模式上调用function_exists(),如果存在,则调用该函数。(“我正在触发'登录'事件。“mymodule_login”功能是否存在?我就这么称呼它。“yourmodule_login”存在吗?不?'nextmodule_login'怎么样?“等等)再次,有点笨拙,但它工作得很好。

Drupal中发生的一切都是因为其中一个事件被解雇而发生的。MenuAPI只知道不同的插件模块处理了哪些url/路径,因为它触发了“menu”事件(hook_menu)并收集了所有元数据插件模块的响应。(“我会处理网址'news/recent',这是在需要构建该页面时调用的函数...”)内容只会被保存,因为Drupal的FormAPI负责构建页面,并触发“表单已提交”事件,以便模块响应。每小时维护的发生是因为触发了hook_cron(),并且任何以mymodulename_cron()作为函数名的模块都将调用其函数。

其他一切最终都只是细节——重要的细节,但都是这个主题的变体。index.php是控制器,菜单系统决定了“当前页面”是什么,并且在构建该页面的过程中触发了许多事件。插件模块可以挂接到这些事件并更改工作流程/提供其他信息/等。这也是许多Drupal资源专注于制作模块的部分原因。如果没有模块,Drupal实际上除了说“有人要求一个页面!它存在吗?不?好吧,我会提供一辆404。


答案 2

Drupal Page Serving Mechanism

要了解Drupal的工作原理,您需要了解Drupal的页面服务机制。

简而言之,所有调用/url/请求都由索引提供.php索引通过包含各种包含文件/模块来加载Drupal,然后调用模块中定义的相应函数来为请求/url提供服务。

以下是Pro Drupal Development一书中的摘录,它解释了Drupal的引导过程,

引导过程

Drupal 通过经历一系列引导阶段,在每个请求上引导自己。这些阶段在 bootstrap.inc 中定义,并按照以下各节所述进行。

初始化配置

此阶段填充Drupal的内部配置数组并建立站点的基本URL($base_url)。设置.php文件通过include_once()进行解析,并应用其中建立的任何变量或字符串覆盖。有关详细信息,请参阅文件站点/all/default/default.settings 的“变量覆盖”和“字符串覆盖”部分.php。

早期页面缓存

在需要高级别可伸缩性的情况下,可能需要在尝试数据库连接之前调用高速缓存系统。早期页面缓存阶段允许您包含(包含())一个PHP文件,其中包含一个名为page_cache_ fastpath()的函数,该文件接管并将内容返回到浏览器。通过将page_cache_fastpath变量设置为 TRUE 来启用早期页面缓存,通过将cache_inc变量设置为文件的路径来定义要包含的文件。有关示例,请参阅有关缓存的章节。

初始化数据库

在数据库阶段,确定数据库的类型,并建立将用于数据库查询的初始连接。

基于主机名/IP 的访问控制

Drupal允许基于每个主机名/IP地址禁止主机。在访问控制阶段,进行快速检查以查看请求是否来自被禁止的主机;如果是这样,则拒绝访问。

初始化会话处理

Drupal利用PHP的内置会话处理,但用自己的处理程序覆盖一些处理程序来实现数据库支持的会话处理。会话在会话阶段初始化或重新建立。表示当前用户的全局$user对象也在此处初始化,尽管为了提高效率,并非所有属性都可用(在需要时通过显式调用user_load()函数来添加它们)。

晚页缓存

在页面缓存后期阶段,Drupal加载足够的支持代码来确定是否从页面缓存中提供页面。这包括将数据库中的设置合并到初始化配置阶段创建的数组中,以及加载或解析模块代码。如果会话指示请求是由匿名用户发出的,并且启用了页面缓存,则从缓存中返回页面并停止执行。

语言确定

在语言确定阶段,Drupal的多语言支持被初始化,并根据站点和用户设置决定使用哪种语言来为当前页面提供服务。Drupal支持几种确定语言支持的替代方法,例如路径前缀和域级语言协商。

路径

在路径阶段,将加载处理路径和路径别名的代码。此阶段使人类可读的URL能够被解析,并处理内部Drupal路径缓存和查找。

此阶段通过加载常见函数库、主题支持以及对回调映射、文件处理、Unicode、PHP 图像工具包、表单创建和处理、邮件处理、可自动排序表和结果集分页的支持来完成引导过程。Drupal的自定义错误处理程序已设置,并且所有启用的模块都已加载。最后,Drupal 触发 init 钩子,以便模块有机会在请求的正式处理开始之前收到通知。

一旦Drupal完成了引导,框架的所有组件都可用。现在是时候接受浏览器的请求并将其传递给将处理它的PHP函数了。URL 和处理 URL 的函数之间的映射是使用同时处理 URL 映射和访问控制的回调注册表完成的。模块使用菜单挂钩注册其回调(有关更多详细信息,请参阅第 4 章)。

当 Drupal 确定存在浏览器请求的 URL 成功映射到的回调,并且用户有权访问该回调时,控制权将移交给回调函数。

处理请求

回调函数执行处理和累积满足请求所需的数据所需的任何工作。例如,如果收到 http://example.com/ q=node/3 等内容请求,则 URL 将映射到 node.module 中的函数 node_page_view()。进一步的处理将从数据库中检索该节点的数据,并将其放入数据结构中。然后,是时候进行主题了。

数据主题

主题设置涉及将已检索、操作或创建的数据转换为 HTML(或 XML 或其他输出格式)。Drupal将使用管理员选择的主题来为网页提供正确的外观。然后将生成的输出发送到 Web 浏览器(或其他 HTTP 客户端)。


推荐