php $app->run(),Thinkphp 5.x 应用启动 App::run()

在上文加载完配置等一系列工作之后,进入App::run(),在run()方法中,

首先通过自动加载机制拿到 Request 的一个实例

20200402184653227367.png

接着 $config = self::initCommon()初始化公共配置,先是 addNamespace 添加app当前所在的命名空间,然后 进行 self::init()初始化,跟进去

20200402184653782076.png

它会进行加载默认的application下的config.php配置文件、database.php数据库配置文件

还会读取额外的application\extra\ 下的配置文件、加载公共文件等等操作

20200402184653859227.png

最后又会调用 Config::get(),将其配置参数全部放入到数组中

20200402184654163927.png

然后回到 self::initCommon 函数中继续往下走,就是检查参数、加载额外需要的文件等等

20200402184654367059.png

回到 原来的run函数中继续往下走,先是进行 模块/控制器绑定操作,这里默认 BIND_MODULE 没定义 所以不走

20200402184654850476.png

然后往下走来到$dispatch = self::routeCheck($request, $config);,功能是URL 路由检测 跟进

20200402184655168848.png

进入了,先来到path方法,获取你的访问路径index/index/index

20200402184655232327.png

20200402184655412998.png

然后接着开始 路由的判断

20200402184655491126.png

默认runtime目录下没有路由的缓存文件,然后就就会去包含application目录下的route.php文件

20200402184655609295.png

接着进行路由的检测 进入到 check 方法中

20200402184655688399.png

在check方法中,先对你的路由路径index/index/index 中的 ‘/ ‘进行 ‘|‘ 替换处理

20200402184656203067.png

接着进入 $request->method 方法中 对该路由请求的方式为哪种类型,最后走的是如下

20200402184656268500.png

继续跟进它会获取服务器的$_SERVER的变量,然后调用input方法

20200402184656409130.png

看起来是获取 REQUEST_METHOD 中的值

20200402184656498001.png

然后又调用 getFilter 方法,来获取全局过滤的规则

20200402184656760706.png

20200402184657182597.png

上面获取完全局过滤的规则之后,就开始进行过滤操作

20200402184658037122.png

到这里 又回到了 check方法中,上面完成了 获取了 请求类型的路由规则 和 http的请求方式 和 请求的路径

然后接着开始进行 URL绑定,默认为空

20200402184658199238.png

这里接着把刚才 | 替换为 /

20200402184658469756.png

然后这里就走出了check方法,最后来到了 parseUrl 方法中, 该方法 实现的功能

先进入parseUrlPath这个方法,对 路由方法的分割,比如这里是Index/index/index,那么就如下返回

20200402184700010831.png

20200402184700468856.png

然后解析 模块 控制器 动作 以及 所带的参数

20200402184701233534.png

20200402184701646636.png

最后返回解析完的数据

20200402184701855628.png

到现在 已经是 回到了 app->run 的主方法中 routeCheck 的方法,所以 自己看来可以理解为就是对 路径的访问 路由方式的判断 解析 模块 控制器 动作 以及 所带的参数的操作!

到这里在App::run()方法中已经执行了一般了,主要的 initCommon routeCheck 两个方法都执行过了

现在继续执行的就是 exec 方法

到目前,前面得了 routeCheck 方法 会把结果放在 $dispatch中

20200402184701928873.png

然后进入 exec方法中,该方法会根据 $dispatch[‘type‘] 判断,这里是 module,那么走 module 的分支 module()方法

20200402184702256034.png

module() 该方法主要的操作就是 初始化模块

20200402184702581242.png

来到其中的 init 方法 ,流程就是 先根据模块 定位模块的目录 然后加载 当前模块目录下的 config.php文件

20200402184702817579.png

然后加载 当前模块目录下的 config.php文件

20200402184703115442.png

接着读取数据库配置文件等等

20200402184703300996.png

然后出$request->module方法 重新来到 exec 中module方法 中,接着获取控制器名

20200402184703517801.png

再获取操作名

20200402184703900629.png

再整合 控制器和动作

20200402184704028563.png

接着再次获取动作名

20200402184704236579.png

最后开始调用

20200402184704460220.png

20200402184704545185.png

真正调用Action的函数

20200402184704636008.png

最后在exec中返回调用返回来的数据$data

20200402184704918246.png

通过该Response创建,然后最后echo

20200402184705164349.png

20200402184705347950.png

到这里完整的一次http请求就结束了!

原文:https://www.cnblogs.com/zpchcbd/p/12563157.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值