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则返回模板输出信息;

ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程的更多相关文章

  1. 处理器(也就是执行流程图上面的controller)执行逻辑(十)

    处理器继承自:AbstractController,MultiActionController   一.AbstractController 如上图,可以分析出AbstractController用的 ...

  2. thinkphp 官方文件执行引入流程

    官方手册上的执行流程图: 系统流程 用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内存开销 系统常量判断及定义 载 ...

  3. TP框架基础 (二) ---空控制器和空操作

    通过之前的学习我们知道了index.php是一个入口文件,如果没有这个入口文件的话,我们需要自己创建! [视图模板文件创建] 视图模板文件存放发位置在: 里面没有模板文件 如果我们想要访问Login控 ...

  4. 【转】PHP框架性能测试报告 - ThinkPHP 3.2.3 Laravel 5.2 Yii2.0.5

    作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情. 用ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期代码解耦是个让人头疼的事情.不 ...

  5. ThinkPHP控制器

    ThinkPHP控制器Controller 1.什么是控制器 在MVC框架中,其核心就是C(Controller)控制器.主要用于接收用户请求,处理业务逻辑. 2.控制器的定义 在一个ThinkPHP ...

  6. Hibernate第二篇【API讲解、执行流程图】

    前言 从上一篇中已经大致介绍了Hibernate并且有了一个快速入门案例的基础了,-.本博文主要讲解Hibernate API 我们看看快速入门案例的代码用到了什么对象吧,然后一个一个讲解 publi ...

  7. 180807-Quick-Task 动态脚本支持框架之Groovy脚本加载执行

    Quick-Task 动态脚本支持框架之Groovy脚本加载执行 上一篇简答说了如何判断有任务动态添加.删除或更新,归于一点就是监听文件的变化,判断目录下的Groovy文件是否有新增删除和改变,从而判 ...

  8. FastAdmin 将 PHP 框架升级到 ThinkPHP 5.1

    FastAdmin 将 PHP 框架升级到 ThinkPHP 5.1 社区经常有人问什么时候升级到 ThinkPHP 5.1,但是 ThinkPHP 5.1 和 ThinkPHP 5.0 差别非常大, ...

  9. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)

    workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...

随机推荐

  1. DNS查找域名的过程

    当我们在浏览器输入一个url地址时,需要获取到这个url的域名,本篇文章主要介绍了关于DNS查找解析域名的过程的一些东西. 关于DNS 不清楚DNS的小伙伴可以点这里:关于域名系统DNS解析IP地址的 ...

  2. 极客DIY:打造你的专属黑客U盘

    简介 由于“Bad USB漏洞”的存在,USB闪存驱动器也成了常见的攻击目标.Bad-USB让黑客可以重新编程微控器作为一个“人机界面装置”(HID)或键盘,然后在目标机器上执行自定义键盘敲击.这种情 ...

  3. OpenFlow:Enabling Innovation in Campus Networks

    SDN领域,OpenFLow现在已经成为了广泛使用的南向接口协议.若想好好学习SDN,在这个领域有所进步,需要熟悉OpenFlow协议.我最近找了篇有关OpenFLow的论文,发现最早该协议是在Sig ...

  4. c++中this指针的用法

    1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将 ...

  5. 洛谷P1373 小a和uim之大逃离[背包DP]

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  6. suid sgid sbit chattr lsattr

    suid 一般用于二进制可执行文件,suid代表当用户执行此二进制文件时,暂时具有此文件所有者的权限 chmod 4xxx binfile sgid 一般用于目录,sgid代表当其他用户在此目录下创建 ...

  7. android第一行代码-1.项目结构

    0.项目结构 一个简单的android项目结构大致如下 入口就是MainActivity这个类,如果对于一个陌生的项目,最好的办法是看AndroidMainifest.xml,如下 <?xml ...

  8. Laravel五大功能之Eloquent关系模式

    Eloquent是Laravel的原始ActiveRecord是实现的,建立在Laravel的Fluent Query Builder之上的,所以Eloquent类和Fluent类是一样的,能实现复杂 ...

  9. ComponetArt Upload上传组件

    componentArt的组件很炫,但示例并非单独的,要分离开来用还得费一番周折. 一个不经意问题,足足困扰了一好几天,服务器的时间不对,导致控件无法正常显示,无浏览文件按钮 看来,控件的开发者设定了 ...

  10. Struts2 token禁止重复提交表单

    如果服务器响应慢的情况下,用户会重复提交多个表单,这时候有两种设计思想: 1.在客户端使用JS技术,禁止客户重复提交表单.但是这样会使一些不使用浏览器方式登陆的人比如使用底层通信来攻击你的服务器 2. ...