ThinkPHP3.0完全开发手册
我们以访问网址 http://serverName.com/index.php/User/read/id/8 为例,分两种情况来解析下系统的执行流程,首先是调试模式下面的主要执行流程:
序号 |
流程说明 |
1 |
用户访问网站URL地址 |
2 |
调用项目的入口文件(这里是index.php) |
3 |
载入系统入口文件ThinkPHP.php |
4 |
判断系统常量,如果没有定义则自动生成 |
5 |
载入系统运行时文件runtime.php并定义项目路径常量 |
6 |
加载运行时所需的文件(通过调用load_runtime_file函数) |
7 |
加载系统基础函数库文件common.php |
8 |
读取核心基础文件列表和加载系统别名定义文件 |
9 |
检查项目相关目录是否存在,不存在则自动生成 |
10 |
调用Think::start执行入口 |
11 |
设置异常和错误处理机制 |
12 |
注册系统自动加载机制 |
13 |
预编译当前项目 |
14 |
加载框架惯例配置文件 |
15 |
读取当前的运行模式如果不是标准模式则加载模式的配置文件(如果存在) |
16 |
加载模式和项目配置文件 |
17 |
加载框架底层语言包文件 |
18 |
加载当前模式的系统行为定义文件 |
19 |
加载当前模式的项目行为定义文件(如果存在) |
20 |
读取核心编译文件列表 |
21 |
载入项目公共函数文件 |
22 |
加载模式和项目别名定义文件 |
23 |
加载系统调试模式配置文件 |
24 |
加载项目调试模式配置文件(如果存在) |
25 |
执行当前模式的App::run();运行项目 |
26 |
如果定义了动态载入则载入动态项目配置文件和公共文件 |
27 |
URL调度,根据URL模式设置分析当前URL地址 |
28 |
URL路由检测 |
29 |
获取当前URL地址的分组、模块和操作名 及其他参数并生成URL相关常量定义 |
30 |
如果检测到分组,则加载分组的配置文件和公共文件 |
31 |
检测模板主题并生成模板系统常量 |
32 |
设置SESSION_ID 开启Session |
33 |
根据分组和模块名,定位到控制器类并且实例化 |
34 |
检查并执行当前操作的前置方法 |
35 |
检查当前模块的_initialize方法 |
36 |
执行当前操作方法 |
37 |
调用控制器的Display方法输出 |
38 |
定位当前操作方法的模板文件 |
39 |
调用模板引擎解析模板内容并生成模板编译缓存文件 |
40 |
读取模板缓存文件进行变量输出,替换解析返回的内容中的需要替换的特殊字符串 |
41 |
生成表单令牌哈希 |
42 |
输出模板内容到浏览器 |
43 |
如果开启页面Trace显示则调用trace信息显示 |
44 |
检查并执行当前操作的后置方法 |
45 |
项目运行结束,记录内存中的日志信息到文件 |
如果在部署模式下面(假设已经生成项目编译缓存),基本的系统流程是:
序号 |
流程说明 |
1 |
用户访问网站URL地址 |
2 |
调用项目的入口文件,如果替换了入口文件,则调用项目编译缓存文件,并跳过下面的3、4、5流程,直接执行后面的流程。 |
3 |
载入系统入口文件ThinkPHP.php |
4 |
判断系统常量,如果没有定义则自动生成 |
5 |
载入项目编译缓存文件~runtime.php |
6 |
调用Think::start执行入口 |
|
后面的流程和调试模式基本相同,只是模板编译过程省略了 |
系统执行流程根据不同的设置、行为和模式影响,可能存在差异,并不一定完整。但是开启页面Trace功能后,你就可以比较直观的看到当前的文件载入流程,能够帮助你了解系统的执行流程,例如新版的blog示例在关闭调试模式下面一共加载了20个文件,列表如下:
[0] =>
E:\www\App\Examples\Blog\index.php
[1] => E:\www\App\ThinkPHP\ThinkPHP.php
[2] => E:\www\App\Examples\Blog\Runtime\~runtime.php
[3] => E:\www\App\Examples\Blog\Lib\Behavior\CheckLangBehavior.class.php
[4] => E:\www\App\Examples\Blog\Lib\Action\BlogAction.class.php
[5] => E:\www\App\Examples\Blog\Lib\Action\PublicAction.class.php
[6] => E:\www\App\ThinkPHP\Lib\Core\Model.class.php
[7] => E:\www\App\ThinkPHP\Lib\Core\Db.class.php
[8] => E:\www\App\ThinkPHP\Lib\Driver\Db\DbMysql.class.php
[9] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Category.php
[10] => E:\www\App\Examples\Blog\Lib\Model\AdvModel.class.php
[11] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Blog.php
[12] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Comment.php
[13] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Tag.php
[14] => E:\www\App\Examples\Blog\Lib\Model\BlogViewModel.class.php
[15] => E:\www\App\Examples\Blog\Lib\Model\ViewModel.class.php
[16] => E:\www\App\Examples\Blog\Lib\Model\BlogModel.class.php
[17] => E:\www\App\Examples\Blog\Lib\Model\CategoryModel.class.php
[18] => E:\www\App\Examples\Blog\Lib\ORG\Page.class.php
[19] =>
E:\www\App\Examples\Blog\Runtime\Cache\2ab73b774a28fab5232b8c752b654018.php