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

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

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

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

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

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

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

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

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

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

然后接着开始 路由的判断

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

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

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

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

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

看起来是获取 REQUEST_METHOD 中的值

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

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

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

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

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

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

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

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

最后返回解析完的数据

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

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

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

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

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

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

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

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

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

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

再获取操作名

再整合 控制器和动作

接着再次获取动作名

最后开始调用

真正调用Action的函数

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

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

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

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

php $app-run(),Thinkphp 5.x 应用启动 App::run()相关推荐

  1. appium启动app失败_Appium-Desktop Capability 配置及启动App演示

    Appium-Desktop Capability配置介绍 desired capability的功能是配置Appium会话.为什么要配置capability,目的就是为了告诉Appium服务器您想要 ...

  2. Android之抓取adb logcat全日志后怎么过滤掉只包含当前app进程的日志(一般抓启动app奔溃日志)

    1 .问题 有时候我们启动APP的时候,APP奔溃,在android studio里面日志可能冲掉,或者是云平台的手机安装的app,根本就没有android stduio,那我们用什么办法快速知道启动 ...

  3. android html 启动app,Android js交互 与 Html启动App

    最近项目刚好有做到内部HTML页面跳转原生页面和html代码启动App页面的功能,做完之后觉得相关知识可以整理一下 先说下项目所用到的js交互 android调取JS的方法 WebView直接加载js ...

  4. html打开另外一个app并且传参,Web网页启动app及传参的方式

    一.网页启动APP 由于安全隐私的原因,目前网页端无法通过js脚本直接判断某个APP是否已安装,只能首先通过js尝试性的启动app,然后再进入安装流程.web网页上启动app的方式有两种: 1. sc ...

  5. App性能优化(一)—— 启动优化,冷启动,热启动,温启动

    标签 : Android架构师之路 APP启动方式 App启动方式分三种:冷启动(cold start).热启动(hot start).温启动(warm start) ▲ 冷启动 系统不存在App进程 ...

  6. AndroidStudio启动app时闪退问题解决过程

    问题描述: Android app在启动时闪退的问题有很多种,大部分可能集中在代码有问题上,譬如StartActivity的时候启动不了. 看提示里一般是有错误出现的,这个很好解决,只要找到对应的错误 ...

  7. 东莞php开发wfkjnet,thinkphp核心源码注释|App.class.php

    thinkphp核心源码注释|App.class.php 2/10/2017人气:330 // +--------------------------------------------------- ...

  8. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理...

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  9. 【Android】解决启动APP闪黑/白屏

    前言 问题:在App启动过程中会出现闪白屏或黑屏的一段时间才进入布局界面.这样的体验十分不好. 首先来了解一下 冷启动 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用, ...

最新文章

  1. 【VS开发】【电子电路技术】RJ45以太网传输线研究
  2. 第四期 SA 分析师认证名单正式公布!
  3. MongoDB常用操作命令
  4. 敏捷制造:并不是你想像的矛盾体
  5. CentOS中通过NAT连接网络
  6. 使用vue+webpack从零搭建项目
  7. 个人和结对项目 - 英语单词词频统计
  8. 【Flink】Flink 源码之时间处理
  9. 在Python程序中设置函数最大递归深度
  10. python时间模块time
  11. java tostring apache_apache lang ToStringBuilder java类的使用
  12. Navicat安装配置
  13. java-php-python-ssm制药企业人力资源管理系统计算机毕业设计
  14. 路由追踪测试软件,路由追踪命令是什么 使用路由追踪的技巧
  15. java servlet mysql_servlet+mysql实现简易的登录功能
  16. 复习C++期末考试题目
  17. C#中的转义字符和Verbatim字符串
  18. 笔记本电脑亮度不能调节的一种解决方案
  19. js抓取今日头条文章
  20. java数组下标异常越界程序,Java程序运行时会自动检查数组的下标是否越界,如果越界,会抛出下面的哪一个异常?...

热门文章

  1. 构建可靠系统的原则与实践
  2. 阿里AI界的新伙伴,1秒钟自动生成20000条文案
  3. Michael Jordan:当下的AI其实都是伪“AI” 1
  4. 曦智科技发布最新光子计算处理器PACE
  5. 我!程序猿!被银行套路了!
  6. 深度好文 | 战“疫”上云正当时:打开云计算的正确姿势
  7. AI时代的交换机什么样?华为CloudEngine 16800告诉你!
  8. 上周五,小编参加了一场高大上的“9”会
  9. python输入三个商品_用python3采集shopify站点商品
  10. mysql write rows_解析MYSQL BINLOG 二进制格式(5)--WRITE_ROW_EVENT