文档章节

详细解析Thinkphp5.1源码执行入口文件index.php运行过程

o
 osc_w9s1w4o0
发布于 2019/03/30 22:23
字数 948
阅读 27
收藏 0

精选30+云产品,助力企业轻松上云!>>>

详细解析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()响应请求。

具体过程如下:

  1. 通过容器Container通过反射模式注册实例化app类
  2. 调用app类应用程序初始化run方法
    1. 初始化应用-run()
      1. 初始化应用-initialize()
        1. 设置环境变量目录,如runtime_path、vendor_path、app_path、root_path、route等。-initialize()
        2. 加载环境变量配置.env-initialize()
        3. 注册应用命名空间-initialize()
          1. 初始化应用-init()
        4. 找到当前运行模块
        5. 判断缓存配置文件是否存在,存在,则加载初始化文件init.php,不去读取应用或模块下的配置文件
        6. 不存在,则去读取应用或模块下的配置文件,如:tags、common、provider、middleware等
        7. 如果模块下拥有同样的配置,那么模块下的配置即覆盖应用下的配置
      2. 初始化数据库配置
      3. 读取语言包
      4. 路由初始化
    2. 路由检测
      1. 检测是否有缓存
      2. 是否开启强制路由
      3. 路由检测-$this->route->check($path, $must);【此时如果路由找不到,且路由中未定义miss,则在这里抛出异常。】
        1. 自动检测域名路由
          1. 检测域名路由
            1. 检测域名路由别名
            2. 检测URL绑定
            3. 路由组检测路由-RuleGroup->check()【一个请求地址遍历路由文件一个一个匹配,是否匹配中】
              1. 检测是否跨域路由设置,是则加跨域,跨域参数加在$this->option变量中
              2. 检测路由分组有效性,路由请求是否与路由设置一致,如请求类型、域名、参数等
              3. 检测路由前置行为,并通过容器方式注册钩子,并执行行为。所以,路由中的行为在路由检测中就执行了。
              4. 路由分组检测think\Route\RouteItem->check();
              5. 匹配中路由,返回路由分发地址
            4. 匹配中路由,通过中间件过度执行路由匹配结果,$response = $this->middleware->dispatch($this->request);【如果路由找不到,且路路由中定义了miss,则在这里跑出miss对应的路由。】
              1. 如果有绑定中间件,则执行中间件。如果中间件接手返回机制,返回一个response对象,则不会执行路由的分发机制。否则,中间件执行完,执行到return $next($request);的时候,继续执行路由的分发机制-think\Route\Dispatch。
              2. 执行路由分发机制-think\Route\Dispatch的时候才执行路由的后置行为。【路由后置行为建议使用中间件替代】(来自源码)
    3. 执行完run。返回执行结果。【路由分发的执行结果(来自控制器)或中间件的执行结果】
    4. 执行think\Response的send()响应请求。【注意:如果代码中自定义了返回机制,且die或exit,则不会走到这一步,则路由中定义的header跨域之类的也因此不会生效,需要自定义header返回处理】
 
 
 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Yii2源码分析(一):入口

写在前面,写这些随笔是记录下自己看Yii2源码的过程,可能会有些流水账,大部分解析放在注释里说明,由于个人水平有限,有不正确的地方还望斧正。 web入口文件Index.php // 定义全局的常量,...

linzzs
昨天
0
0
Yii2源码分析(一):入口

写在前面,写这些随笔是记录下自己看Yii2源码的过程,可能会有些流水账,大部分解析放在注释里说明,由于个人水平有限,有不正确的地方还望斧正。 web入口文件Index.php // 定义全局的常量,...

linzzs
昨天
0
0
小试 RPC for php

最近整理代码,准备试用RPC。 RPC(Remote Procedure Call Protocol)——远程过程调用协议。RPC采用客户机/服务器模式,是一个轻型、安全、跨平台、支持对象传输、引用参数传递、面向服务的...

leighj
2014/03/20
7
0
【迪士尼彩乐园】全套源码分享下载带三个急速,后台带AB盘完美无错

【迪士尼彩乐园】全套源码分享下载带三个急速,后台带AB盘完美无错联系Q:84017116 源码类别:时时系统/两面盘 界面语言:简体中文 源码授权:无加密文件及认证授权,永久性可直接使用。 版本...

qubaoquan
2018/07/17
0
0
【迪士尼彩乐园】全套源码分享下载带三个急速,后台带AB盘完美无错

【迪士尼彩乐园】全套源码分享下载带三个急速,后台带AB盘完美无错联系Q:2947702644 源码类别:时时系统/两面盘 界面语言:简体中文 源码授权:无加密文件及认证授权,永久性可直接使用。 版...

sjbv
2018/07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

dict.items()和dict.iteritems()有什么区别?

问题: Are there any applicable differences between dict.items() and dict.iteritems() ? dict.items()和dict.iteritems()之间是否有适用的区别? From the Python docs: 从Python文档中......

法国红酒甜
39分钟前
20
0
R中“ =”和“ <-”赋值运算符有什么区别?

问题: What are the differences between the assignment operators = and <- in R? R中赋值运算符=和<-之间有什么区别? I know that operators are slightly different, as this example ......

fyin1314
今天
20
0
之间的区别 和

问题: I'm learning Spring 3 and I don't seem to grasp the functionality behind <context:annotation-config> and <context:component-scan> . 我正在学习Spring 3,并且似乎不太了解<......

javail
今天
15
0
业内首款,百度工业视觉智能平台全新亮相

本文作者:y****n 业内首款全国产化工业视觉智能平台——百度工业视觉智能平台亮相中国机器视觉展(Vision China),该平台所具有的核心AI能力完全自主可控,在质检、巡检等场景中具有高效、...

百度开发者中心
昨天
7
0
我们如何制作xkcd样式图? - How can we make xkcd style graphs?

问题: Apparently, folk have figured out how to make xkcd style graphs in Mathematica and in LaTeX . 显然,民间已经想出了如何在Mathematica和LaTeX中制作xkcd风格的图形。 Can we d......

富含淀粉
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部