一、应用启动
在/thinkphp/start.php文件中,用一句代码App::run()->send();实现应用的启动。
// 执行应用
App::run()->send();
 
run()方法可以在/thinkphp/library/think/App.php文件中找到对应方法,这个方法是整个框架的核心方法,实现了路由转换、获取调度信息、根据调度信息执行相应模块控制器的方法、获取方法返回数据、将返回数据赋值给Response对象等一系列操作。
最后,调用返回的Response对象的send()方法将信息返回给客户端,一次完整的http请求就完成了。
 
二、应用调度分析
其中,第12~18步的路由分析和应用调度是框架从底层到应用跳转的核心部分,对URL进行路有分析,获取URL可以使用的调度类型,再根据调度类型,分别调用应用的对应逻辑业务实现。
第18步应用调度 $data = self::exec($dispatch, $config); 的源代码(thinkphp/library/think/App::exec())如下:
$dispatch['type']是App::run()中经过self::routeCheck()、Request::dispatch()后得到的。
 
$dispatch['type']为redirect时,执行重定向跳转Response::create();
$dispatch['type’]为module时,调用self::module();
$dispatch['type']为controller时,调用自动加载器Loader::action();
$dispatch['type']为method时,调用self::invokeMethod();
$dispatch['type']为function时,调用self::invokeFunction();
$dispatch['type']为response时,获取$dispatch['response'];
超出以上调度类型,直接抛出异常报错。
 
6种调度类型中,除redirect、controller、response,其余3种调度类型都是调用的App内的静态方法:
moudule——self::module()
method——self::invokeMethod()
function——self::invokeFunction()
3个静态方法的实现原理基本相同,依次为调用参数分析,反射回调相应方法。

ThinkPHP5.0源码学习之执行应用的更多相关文章

  1. ThinkPHP5.0源码学习之框架启动流程

    ThinkPHP5框架的启动流程图如下: ThinkPHP5的启动流程按照文件分为三步: 1.请求入口(public/index.php) 2.框架启动(thinkphp/start.php) 3.应 ...

  2. ThinkPHP5.0源码学习之缓存Cache(二)

    一.使用Cache类 TP5.0框架默认使用的是File文件缓存驱动,可以修改全局配置文件convention.php中的type,将其改为Redis,这样使用的就是Redis缓存驱动了.

  3. ThinkPHP5.0源码学习之缓存Cache(一)

    一.文件 1.缓存配置文件:thinkphp\convention.php 2.缓存文件:thinkphp\library\think\Cache.php 3.驱动目录:thinkphp\librar ...

  4. ThinkPHP5.0源码学习之注册自动加载

    ThinkPHP5框架的自动注册加载流程如下:

  5. ThinkPHP5.0源码学习之注册错误和异常处理机制

    在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册. // 注册错误和异常处理机制 \think\Error::register(); ...

  6. 【Spark2.0源码学习】-1.概述

          Spark作为当前主流的分布式计算框架,其高效性.通用性.易用性使其得到广泛的关注,本系列博客不会介绍其原理.安装与使用相关知识,将会从源码角度进行深度分析,理解其背后的设计精髓,以便后续 ...

  7. spark2.0源码学习

    [Spark2.0源码学习]-1.概述 [Spark2.0源码学习]-2.一切从脚本说起 [Spark2.0源码学习]-3.Endpoint模型介绍 [Spark2.0源码学习]-4.Master启动 ...

  8. Spring5.0源码学习系列之事务管理概述

    Spring5.0源码学习系列之事务管理概述(十一),在学习事务管理的源码之前,需要对事务的基本理论比较熟悉,所以本章节会对事务管理的基本理论进行描述 1.什么是事务? 事务就是一组原子性的SQL操作 ...

  9. [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...

随机推荐

  1. redis发布订阅、事务、脚本

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

  2. python框架之Django(16)-接入Redis

    准备 安装Redis 参考 Ubuntu 中 Redis 的安装与使用. 在python中使用Redis 参考 python 中使用 Redis . 安装依赖包 在 Django 中接入 Redis ...

  3. fastjson java类、字符串、jsonObject之前的转换

    json对象转成json字符串 JSONObject json = new JSONObject(); json.put("page",1); json.put("pag ...

  4. django-ajax post与get请求

    客户端    访问  服务器  方式:      地址栏          get      a标签           get      form表单     get/post      ajax ...

  5. 游戏客户端Session的统一管理

    看本系统文章需要些C语言.数据结构和网络基础知识! 说明:由于游戏服务器端会有成千上万的客户端进行连接请求,所以要求我们需要做一些简单的会话管理!如下图 1.简单说明 进行统一的分配和管理,就需要我们 ...

  6. halcon脱离hdvp运行

    halcon如何脱离HDevelop运行:第一种方式(测试多台电脑全部正常):(推荐)使用本站开发的脱机修复助手:https://www.51halcon.com/thread-1217-1-1.ht ...

  7. 基于Jenkins实现持续集成【持续更新中】

    持续集成 1.什么是持续集成:Continuous integration (CI)持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生 ...

  8. 基于Vue的Quasar Framework 介绍 这个框架UI组件很全面

    基于Vue的Quasar Framework 介绍 这个框架UI组件很全面 基于Vue的Quasar Framework 中文网http://www.quasarchs.com/ quasarfram ...

  9. Linux系统命令 3

    1.vmstat命令监控系统资源[root@localhost ~]#vmstat [刷新延时 刷新次数] 例如:[root@localhost proc]#vmstat 1 3 2.dmesg开机时 ...

  10. Twisted简介

    Twisted是用Python实现的基于事件驱动的网络引擎框架,Twisted支持许多常见的传输及应用层协议,包括TCP.UDP.SSL/TLS.HTTP.IMAP.SSH.IRC以及FTP.就像Py ...