跳转到主要内容

第十一节 接受一个Web请求

从概念上了解一下Drupal在收到一个Web请求后都做了哪些事,是对学习Drupal非常有帮助的。这一小节会带领读者快速了解一下这一过程。如果你希望自己来跟踪调试这整个过程,那么请使用一个好的调试工具,并且从Index.php开始,因为Drupal的大部分请求都是被这个文件所接收的。本小节中所讲述的生成一个简单页面的过程,看起来似乎有些复杂,但这个过程中的每一步,都是相当灵活的。   Web服务器的角色 Drupal跑在一个web服务器之上,比如Apache。如果Web服务器尊循Drupal的.htaccess文件,那么某些PHP设置就会被初始化而且URL会被检查。几乎所有对Drupal的访问,都要通过index.php文件。比如,当你调用http://example.com/foo/bar时,会经历以下步骤: 1.       定于在Drupal的.htaccess文件中的Mod_rewrite规则,会将请求的URL进行切分,把基础路径取出,在我们的例子中,也就是foo/bar 2.       这个路径会被赋值给查询变量q 3.       于是,最终的URL变为http://example.com/index.php?q=foo/bar 4.       Drupal把foo/bar当成内部Drupal路径,并开始运行index.php进行处理。   由于这样的处理流程,所以Drupal认为,http://example.com/index.php?q=foo/barhttp://example.com/foo/bar实际上是同样的链接。因为从内部看来,两者的路径实际上是一样的。这也就使得Drupal处理的URL无须包含那些怪怪的字符。通常我们把这样的URL称为clean URLs。   如果使用其它web服务器,比如IIS,可以通过使用Windows Internet Server Application Programming Interface(ISAPI)的模块,比如ISAPI Rewrite来使用clean URL的功能。IIS 7 以后的版本直接就能支持Clean URL。   Drupal请求初始化过程 Drupal的请求初始化处理过程包括一系列的步骤。这些步骤定义在bootstrap.inc文件中,其内容如下如述: (1)     初始化配置 这一步骤中,Drupal配置其各种内部变量,并建立起网站的base_url。Drupal会使用include_once方法来装载Settings.php文件,同时还装载所有的用来覆盖默认配置的的字符串和变量。关于这一部分内容,请参见sites/all/default/default.settings.php文件中“String Overrides”和“Variable Overrides”那两节。 (2)     初步页面缓存(Early Page Cache) 在某些需要适应高并发的场合,需要启用缓存系统来防止对数据库的过度访问。初步页面缓存这一步骤把一个PHP文件通过include方法引入,在该PHP文件中有一个方法名为page_cache_fastpath(),它会取得控制权并把内容发送回浏览器。这种初步页面缓存的启用需要将page_cache_fastpath这个变量值设置为TRUE,还需要把cache_inc这个变量值设置到正确的文件路径上,才能够把前面所说的需要引入的PHP文件装载成功。可以查看后面关于缓存的那一章节以了解更多。 (3)     初始化数据库 在数据库这一步骤中,首先会决定数据库的类型,并会创建一个初始的连接用于后面的数据库查询。 (4)     基于域名/IP的访问控制 Drupal是可以限制某个IP/域名的访问的,在访问控制这一步骤中,Drupal会检查是否当前请求来自于一个被限制访问的地址或域名。如果是的话,这一请求就会被拒绝。 (5)     初始化Session Drupal使用了PHP内置的session处理机制,但是它重写了某写session的处理函数,同时使用了它自己的基于数据库的session管理。这一步骤中会为请求初始化或重建session。同时,代表当前用户的全局的$user变量也在这一步骤中被初始化,只不过基于效率的考虑,并不是所有的属性都被赋值(它们会在后面显示调用user_load()时被赋值)。 (6)     后期页面缓存(Late Page Cache) 在后期页面缓存步骤中,Drupal会加载足够的代码来决定是否从缓存取得某个页面。这部分代码包括了把数据库中的设置与在初始化配置时创建的数组进行合并,并会检查加载模块代码。如果Session显示当前的页面请求是由一个匿名用户发出的,那么页面缓存就会被调用,用户浏览器会收到从缓存发出的页面,然后运行结束。 (7)     决定语言 在决定语言这一环节,Drupal的多语言系统被初始化,接下来它会决定用什么语言来返回当前页面,这是由当前用户设置以及站点设置所决定。Drupal支持使用多种方式来决定当前的语言,比如使用路径前缀方式,或是域名级别的语言选择。 (8)     路径 在路径这一步骤中,用来处理路径和路径别名的代码被加载。这一步骤使得用户可读式的URL能够被解析,并管理着Drupal内部的路径缓存和查找。 (9)     完整启动 这一步骤实际上完成了整个启动过程,在这一步骤中,通用函数库会被加载,比如,系统的主题,回调函数映射,文件处理,Unicode,PHP图片工具,表单的创建和处理,邮件处理,自动排序表格还有结果集分页等功能。Drupal定制的错误处理工具被启用,并且所有启动的模块会被加载。最后,Drupal会调用各个模块的_init钩子,以使得模块有机会在正式处理业务逻辑前进行相应的初始化工作。   一旦Drupal完成了整个初始化过程,它的框架的各部分就都进入运行状态。接下来就可以接收真正的浏览器请求,并将请求发到相应的PHP方法。URL与PHP方法间的映射是通过回调函数注册来完成的,在映射的同时,还考虑了访问权限的问题。各个模块都通过_menu这个钩子来注册各自的回调函数(关于menu钩子,请看第四章以获取更多内容)。   当Drupal发现在当前请求URL和某个回调函数间存在着映射时,并且当前用户的权限也可以访问该回调函数,那么Drupal就会将控制权交给该函数,以进行相应的处理。   处理一个请求 回调函数负责完成自己的工作,然后会生成相应的数据以返回给客户端。例如,一个请求http://example.com/?q=node/3被Drupal接收到,这个URL会映射到函数node_page_view(),它位于node.module中。接下来,Drupal会从数据库中获取该节点的数据,然后放入一个数据结构中,再然后,用页面模板对其进行包装。   用页面模板包装数据 使用页面模板(也就是主题)对数据进行包装,将其转换成HTML(或是XML以及其它格式)。Drupal会使用管理员已经选定的主题,来给网站一个正确的外观。然后将输入的HTML数据返回给网页浏览器。

 

文章分类