ThinkPHP控制器的执行流程 对用户的第一次URL访问 http:///My/index.php/Index/show/ 所执行的流程进行详细的分析,用户的URL访问首先是定位到了My项目的index.php 入口文件(注意:如果使用了URL_REWRITE,可能index.php已经被隐藏了),项目的入口文件所做的其实是实例化一个App应用实例,并且执行这个应用。 1、加载公共入口文件 在实例化App类之前,我们需要首先加载系统的公共入口文件ThinkPHP.php,这个文件是ThinkPHP的总入口,让我们来一探究竟。在加载ThinkPHP.php文件的过程中,其实完成了下面的操作: 记录开始执行时间 $GLOBALS['_beginTime']; 检测THINK_PATH定义,如果没有则创建; 检测项目名称APP_NAME,如果没有则按照一定规则自动定义; 检测项目编译缓存目录定义,没有则取项目的Temp目录; 加载系统定义文件defines.php和公共函数文件functions.php; 如果项目编译缓存目录不存在,则自动创建项目目录结构; 加载系统核心类库(包括base、App、Action、Model、View、ThinkException、Log); 如果PHP版本低于5.2.0则加载兼容函数库compat.php; 生成核心编译缓存~runtime.php; 记录加载文件时间 $GLOBALS['_loadTime'];
2、 项目初始化init 在加载完成ThinkPHP的公共入口文件之后,我们就开始执行应用了,而首先应该是初始化App应用。 3、 项目预编译 加载系统惯例配置文件convention.php; 加载项目配置文件 config.php; 加载项目公共文件 common.php; 如果是调试模式加载系统调试配置文件 debug.php; 如果定义了项目的调试配置文件则载入 debug.php; 生成项目编译缓存文件~app.php;
4、 URL分析Dispatcher 5、 获取模块和操作名 6、 项目执行exec AUTO_LOAD_CLASS 检查 如果有则导入公共类; 实例化当前模块的Action控制器类; 如果Action控制器不存在则检查空模块 EmptyAction; 检查操作链,如果有执行操作链; 检查前置操作方法 _before_操作名; 执行模块的操作方法,调度转移给Action控制器; 执行后置操作方法 _after_操作名; 执行应用结束过滤器 app_end; 如果开启日志记录,写入错误日志;
7、 执行控制器的操作 实例化视图类View; 取得当前控制器名称; 控制器初始化_initialize; 如果操作方法不存在检查空操作 _empty; 如果空操作没有定义则检查对应的模板文件; 调用模型获取数据; 渲染视图进行输出;
8、 调用模型获取数据find 9、 输出视图 模板变量赋值; 检测是否是布局输出; 检测页面输出编码; 缓存初始化过滤 ob_init; 页面缓存开启ob_start; 缓存开启后执行的过滤; 模版文件名过滤 template_file; 定位当前输出的模板文件; 模版变量过滤 template_var; 根据不同模版引擎进行处理; 如果是PHP模板引擎,直接载入模板文件; 使用内置模板引擎,检测缓存有效期; 缓存无效则重新编译模板文件; 载入模板缓存文件; 获取并清空缓存; 输出编码转换; 输出过滤 ob_content; 开启静态写入则写入静态文件; 如果输出则获取视图运行时间; 如果是display则渲染模板输出信息; 开启页面Trace则显示页面Trace信息; 如果是fetch则返回模板输出信息;
|