对用户的第一次URL访问 http://<serverIp>/My/index.php/Index/show/ 所执行的流程进行详细的分析,用户的URL访问首先是定位到了My项目的index.php 入口文件(注意:若是使用了URL_REWRITE,可能index.php已经被隐藏了),项目的入口文件所作的实际上是实例化一个App应用实例,而且执行这个应用。php
一、加载公共入口文件数据库
在实例化App类以前,咱们须要首先加载系统的公共入口文件ThinkPHP.php,这个文件是ThinkPHP的总入口,让咱们来一探究竟。在加载ThinkPHP.php文件的过程当中,其实完成了下面的操做:数组
记录开始执行时间 $GLOBALS['_beginTime'];缓存
检测THINK_PATH定义,若是没有则建立;session
检测项目名称APP_NAME,若是没有则按照必定规则自动定义;app
检测项目编译缓存目录定义,没有则取项目的Temp目录;框架
加载系统定义文件defines.php和公共函数文件functions.php;函数
若是项目编译缓存目录不存在,则自动建立项目目录结构;布局
加载系统核心类库(包括Base、App、Action、Model、View、ThinkException、Log);fetch
若是PHP版本低于5.2.0则加载兼容函数库compat.php;
生成核心编译缓存~runtime.php;
记录加载文件时间 $GLOBALS['_loadTime'];
二、 项目初始化init
在加载完成ThinkPHP的公共入口文件以后,咱们就开始执行应用了,而首先应该是初始化App应用。
设定错误和异常处理机制(set_error_handler和set_exception_handler);
项目预编译并载入;
设置时区支持;
Session过滤器检查;
session初始化;
检查并加载插件;
URL分析和调度;
获取当前执行的模块和操做名;
加载模块配置文件;
页面防刷新机制检查;
语言检查并读取对应的语言文件;
模板检查并定义相关的模板变量;
RBAC权限检测;
若是开启静态写入则读取静态缓存文件;
应用初始化过滤插件 app_init;
记录应用初始化时间 $GLOBALS['_initTime']
三、 项目预编译
加载系统惯例配置文件convention.php;
加载项目配置文件 config.php;
加载项目公共文件 common.php;
若是是调试模式加载系统调试配置文件 debug.php;
若是定义了项目的调试配置文件则载入 debug.php;
生成项目编译缓存文件~app.php;
四、 URL分析Dispatcher
检查当前URL模式URL_MODEL;
若是存在$_GET变量,则根据当前的URL模式和设置进行重定向;
进行路由定义检测;
分析PATH_INFO的URL信息到数组;
把PATH_INFO获得的值和$_GET合并;
五、 获取模块和操做名
检查VAR_MODULE变量(包括GET 和POST),若是未定义,则获取默认模块名;
检查组件模块;
检查模块假装;
检查VAR_ACTION变量(包括GET 和POST),若是未定义,则获取默认操做名;
检查操做链;
检查操做假装;
六、 项目执行exec
AUTO_LOAD_CLASS 检查 若是有则导入公共类;
实例化当前模块的Action控制器类;
若是Action控制器不存在则检查空模块 EmptyAction;
检查操做链,若是有执行操做链;
检查前置操做方法 _before_操做名;
执行模块的操做方法,调度转移给Action控制器;
执行后置操做方法 _after_操做名;
执行应用结束过滤器 app_end;
若是开启日志记录,写入错误日志;
七、 执行控制器的操做
实例化视图类View;
取得当前控制器名称;
控制器初始化_initialize;
若是操做方法不存在检查空操做 _empty;
若是空操做没有定义则检查对应的模板文件;
调用模型获取数据;
渲染视图进行输出;
八、 调用模型获取数据find
实例化模型类;
模型初始化 _initialize;
判断当前模型名称和对应数据表;
实例化数据库操做对象;
数据表字段检测并缓存;
查询须要的数据;
判断是否视图模型;
若是是延时查询返回ResultIterator对象;
取出数据对象的时候记录乐观锁;
获取文本字段数据;
获取关联数据;
对数据对象自动编码转换;
记录当前数据对象;
返回定义的数据格式(数组或者stdClass对象)
九、 输出视图
模板变量赋值;
检测是不是布局输出;
检测页面输出编码;
缓存初始化过滤 ob_init;
页面缓存开启ob_start;
缓存开启后执行的过滤;
模版文件名过滤 template_file;
定位当前输出的模板文件;
模版变量过滤 template_var;
根据不一样模版引擎进行处理;
若是是PHP模板引擎,直接载入模板文件;
使用内置模板引擎,检测缓存有效期;
缓存无效则从新编译模板文件;
载入模板缓存文件;
获取并清空缓存;
输出编码转换;
输出过滤 ob_content;
开启静态写入则写入静态文件;
若是输出则获取视图运行时间;
若是是display则渲染模板输出信息;
开启页面Trace则显示页面Trace信息;
若是是fetch则返回模板输出信息;