详细解析Thinkphp5.1源码执行入口文件index.php运行过程
详细解析Thinkphp5.1源码执行入口文件index.php运行过程
运行了public目录下的index.php文件后,tp的运行整个运行过程的解析
入口文件index.php代码如下:
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +---------------------------------------------------------------------- // [ 应用入口文件 ]
namespace think; // 加载基础文件
require __DIR__ . '/../thinkphp/base.php'; // 支持事先使用静态方法设置Request对象和Config对象 // 执行应用并响应
Container::get('app')->run()->send();
解析:
1. 执行require __DIR__ . '/../thinkphp/base.php'; 引入base.php,实现自动加载机制。自动加载机制的实现过程请看上一篇文章。
2. 重点解析这行代码:执行Container::get('app')->run()->send(); 通过容器注册App,并且执行think\App.php的run()方法,将执行到的结果给到think\Response.php的send()响应请求。
具体过程如下:
- 通过容器Container通过反射模式注册实例化app类
- 调用app类应用程序初始化run方法
- 初始化应用-run()
- 初始化应用-initialize()
- 设置环境变量目录,如runtime_path、vendor_path、app_path、root_path、route等。-initialize()
- 加载环境变量配置.env-initialize()
- 注册应用命名空间-initialize()
- 初始化应用-init()
- 找到当前运行模块
- 判断缓存配置文件是否存在,存在,则加载初始化文件init.php,不去读取应用或模块下的配置文件
- 不存在,则去读取应用或模块下的配置文件,如:tags、common、provider、middleware等
- 如果模块下拥有同样的配置,那么模块下的配置即覆盖应用下的配置
- 初始化数据库配置
- 读取语言包
- 路由初始化
- 路由检测
- 检测是否有缓存
- 是否开启强制路由
- 路由检测-$this->route->check($path, $must);【此时如果路由找不到,且路由中未定义miss,则在这里抛出异常。】
- 自动检测域名路由
- 检测域名路由
- 检测域名路由别名
- 检测URL绑定
- 路由组检测路由-RuleGroup->check()【一个请求地址遍历路由文件一个一个匹配,是否匹配中】
- 检测是否跨域路由设置,是则加跨域,跨域参数加在$this->option变量中
- 检测路由分组有效性,路由请求是否与路由设置一致,如请求类型、域名、参数等
- 检测路由前置行为,并通过容器方式注册钩子,并执行行为。所以,路由中的行为在路由检测中就执行了。
- 路由分组检测think\Route\RouteItem->check();
- 匹配中路由,返回路由分发地址
- 匹配中路由,通过中间件过度执行路由匹配结果,$response = $this->middleware->dispatch($this->request);【如果路由找不到,且路路由中定义了miss,则在这里跑出miss对应的路由。】
- 如果有绑定中间件,则执行中间件。如果中间件接手返回机制,返回一个response对象,则不会执行路由的分发机制。否则,中间件执行完,执行到return $next($request);的时候,继续执行路由的分发机制-think\Route\Dispatch。
- 执行路由分发机制-think\Route\Dispatch的时候才执行路由的后置行为。【路由后置行为建议使用中间件替代】(来自源码)
- 执行完run。返回执行结果。【路由分发的执行结果(来自控制器)或中间件的执行结果】
- 执行think\Response的send()响应请求。【注意:如果代码中自定义了返回机制,且die或exit,则不会走到这一步,则路由中定义的header跨域之类的也因此不会生效,需要自定义header返回处理】
详细解析Thinkphp5.1源码执行入口文件index.php运行过程的更多相关文章
- Yii2 源码分析 入口文件执行流程
Yii2 源码分析 入口文件执行流程 1. 入口文件:web/index.php,第12行.(new yii\web\Application($config)->run()) 入口文件主要做4 ...
- .1-浅析express源码之入口文件
鸽了鸽了,webpack源码大垃圾,看了那么久,感觉自己越来越渣……还是换个口味,node了解一下? 尝试从express框架源码入手,学习一下node的http模块相关的知识. 入口文件 先从框架的 ...
- Spark源码系列(三)作业运行过程
作业执行 上一章讲了RDD的转换,但是没讲作业的运行,它和Driver Program的关系是啥,和RDD的关系是啥? 官方给的例子里面,一执行collect方法就能出结果,那我们就从collect开 ...
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- Python 多线程、多进程 (一)之 源码执行流程、GIL
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.python ...
- 全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(二)资源的获取和释放
上期的<全网最详细的AbstractQueuedSynchronizer(AQS)源码剖析(一)AQS基础>中介绍了什么是AQS,以及AQS的基本结构.有了这些概念做铺垫之后,我们就可以正 ...
- rest_framework解析器组件源码流程
rest_framework解析器组件源码流程 解析器顾名思义就是对请求体进行解析.为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数 ...
- 曹工说Redis源码(3)-- redis server 启动过程完整解析(中)
文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis,而怎么才能懂,光看是不够的,建议跟着下面的这一篇,把环境搭建起来,后续可以自己阅读源码,或者跟着我这边一起阅读.由于 ...
- 曹工说Redis源码(5)-- redis server 启动过程解析,以及EventLoop每次处理事件前的前置工作解析(下)
曹工说Redis源码(5)-- redis server 启动过程解析,eventLoop处理事件前的准备工作(下) 文章导航 Redis源码系列的初衷,是帮助我们更好地理解Redis,更懂Redis ...
随机推荐
- MarkDown之Typora使用
Typora:所见即所得 常用快捷键 加粗:ctrl + B 标题:ctrl + 16,对于与16级标题 插入公式:ctrl + Shift + m 插入代码:ctrl + Shift + K 插入图 ...
- [no code][scrum meeting] Alpha 2
项目 内容 会议时间 2020-04-07 会议主题 功能规格说明书review 会议时长 30min 参会人员 OCR组(肖思炀,赵涛)和产品经理 $( "#cnblogs_post_bo ...
- BUAA 2020 软件工程 软件分析案例作业
Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件分析案例 我在这个课程的目标是 学习软件 ...
- react 生命周期 个人见解
初始化/实例期 gitDefaultprops 获取组件的默认props状态 gitInitialstate 类定义方式或是直接在构造函数中挂载state componentWillMount 组件 ...
- 基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中
基于ImportBeanDefinitionRegistrar和FactoryBean动态注入Bean到Spring容器中 一.背景 二.实现方案 1.基于@ComponentScan注解实现 2.基 ...
- 单片机stm32的5个时钟源的详细分析
众所周知STM32有5个时钟源HSI.HSE.LSI.LSE.PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的. 其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低 ...
- linux下文件特殊权限设置位S和沾附位T(转载)
今天在创建文件的时候,发现了文件权限末尾有个T,之前没留意过,后来又用c创建(open)了两个文件来查看,在我没有指定权限(省略open的第三个参数)的时候,有时还会出现S,虽然还没弄懂什么时候会出现 ...
- Python matplotlib 概率论与数理统计 伯努利分布 二项分布
Python 代码实现 二项分布 import numpy as np import matplotlib.pyplot as plt import math from scipy import st ...
- cf 12B Correct Solution?(贪心)
题意: 一个数a,一个数b. 现在要将a的每一位上的数字重新整理,生成一个新的不含前导0的数a'. 问a'是否等于b. 思路: a上每一位的数字从小到大排序,找到最小的非零数和第一位交换. 代码: c ...
- DeWeb 与 Unigui的区别
DeWeb 与 Unigui 相同: 都是采用Delphi开发网页的平台 不同: 1 DeWeb不需要安装控件, 而Unigui需要安装自己的控件 2 DeWeb无需要学习HTML/CSS/JavaS ...