zoukankan      html  css  js  c++  java
  • ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程

    ThinkPHP2.2框架执行原理、流程图在线手册

    ThinkPHP控制器的执行流程

    对用户的第一次URL访问 http://<serverIp>/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应用。

    • 设定错误和异常处理机制(set_error_handler和set_exception_handler);
    • 项目预编译并载入;
    • 设置时区支持;
    • Session过滤器检查;
    • session初始化;
    • 检查并加载插件;
    • URL分析和调度;
    • 获取当前执行的模块和操作名;
    • 加载模块配置文件;
    • 页面防刷新机制检查;
    • 语言检查并读取对应的语言文件;
    • 模板检查并定义相关的模板变量;
    • RBAC权限检测;
    • 如果开启静态写入则读取静态缓存文件;
    • 应用初始化过滤插件 app_init;
    • 记录应用初始化时间 $GLOBALS['_initTime']

    3、 项目预编译

    • 加载系统惯例配置文件convention.php;
    • 加载项目配置文件 config.php;
    • 加载项目公共文件 common.php;
    • 如果是调试模式加载系统调试配置文件 debug.php;
    • 如果定义了项目的调试配置文件则载入 debug.php;
    • 生成项目编译缓存文件~app.php;

    4、 URL分析Dispatcher

    • 检查当前URL模式URL_MODEL;
    • 如果存在$_GET变量,则根据当前的URL模式和设置进行重定向;
    • 进行路由定义检测;
    • 分析PATH_INFO的URL信息到数组;
    • 把PATH_INFO得到的值和$_GET合并;

    5、 获取模块和操作名

    • 检查VAR_MODULE变量(包括GET 和POST),如果未定义,则获取默认模块名;
    • 检查组件模块;
    • 检查模块伪装;
    • 检查VAR_ACTION变量(包括GET 和POST),如果未定义,则获取默认操作名;
    • 检查操作链;
    • 检查操作伪装;

    6、 项目执行exec

    • AUTO_LOAD_CLASS 检查 如果有则导入公共类;
    • 实例化当前模块的Action控制器类;
    • 如果Action控制器不存在则检查空模块 EmptyAction;
    • 检查操作链,如果有执行操作链;
    • 检查前置操作方法 _before_操作名;
    • 执行模块的操作方法,调度转移给Action控制器;
    • 执行后置操作方法 _after_操作名;
    • 执行应用结束过滤器 app_end;
    • 如果开启日志记录,写入错误日志;

    7、 执行控制器的操作

    • 实例化视图类View;
    • 取得当前控制器名称;
    • 控制器初始化_initialize;
    • 如果操作方法不存在检查空操作 _empty;
    • 如果空操作没有定义则检查对应的模板文件;
    • 调用模型获取数据;
    • 渲染视图进行输出;

    8、 调用模型获取数据find

    • 实例化模型类;
    • 模型初始化 _initialize;
    • 判断当前模型名称和对应数据表;
    • 实例化数据库操作对象;
    • 数据表字段检测并缓存;
    • 查询需要的数据;
    • 判断是否视图模型;
    • 如果是延时查询返回ResultIterator对象;
    • 取出数据对象的时候记录乐观锁;
    • 获取文本字段数据;
    • 获取关联数据;
    • 对数据对象自动编码转换;
    • 记录当前数据对象;
    • 返回定义的数据格式(数组或者stdClass对象)

    9、 输出视图

    • 模板变量赋值;
    • 检测是否是布局输出;
    • 检测页面输出编码;
    • 缓存初始化过滤 ob_init;
    • 页面缓存开启ob_start;
    • 缓存开启后执行的过滤;
    • 模版文件名过滤 template_file;
    • 定位当前输出的模板文件;
    • 模版变量过滤 template_var;
    • 根据不同模版引擎进行处理;
    • 如果是PHP模板引擎,直接载入模板文件;
    • 使用内置模板引擎,检测缓存有效期;
    • 缓存无效则重新编译模板文件;
    • 载入模板缓存文件;
    • 获取并清空缓存;
    • 输出编码转换;
    • 输出过滤 ob_content;
    • 开启静态写入则写入静态文件;
    • 如果输出则获取视图运行时间;
    • 如果是display则渲染模板输出信息;
    • 开启页面Trace则显示页面Trace信息;
    • 如果是fetch则返回模板输出信息;
  • 相关阅读:
    Makefile 使用总结(转)
    linux,pthread(转)
    Java中this和super的用法总结
    「转」开发十年,只剩下这套Java开发体系了
    js的function立即执行函数
    什么是回调函数
    算法总结:双指针法的常见应用
    26. Remove Duplicates from Sorted Array
    1. Two Sum
    Spring的依赖注入和控制反转
  • 原文地址:https://www.cnblogs.com/52php/p/5659963.html
Copyright © 2011-2022 走看看