ThinkPHP5框架的启动流程图如下:

ThinkPHP5的启动流程按照文件分为三步:

1、请求入口(public/index.php)
2、框架启动(thinkphp/start.php)
3、应用启动(thinkphp/library/App.php)
ThinkPHP框架默认是单入口框架,默认的入口文件为public/index.php,所有请求全部经过入口文件index.php来进行访问。
index.php代码如下:
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');    // 定义应用的根目录 APP_PATH 为 /application
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';

做了两件事:
1、定义APP_PATH常量
2、加载文件start.php。
start.php代码如下:
namespace think;    // 定义think命名空间,所有thinkphp类都在think及其子命名空间下。程序中用到框架类的时候要先use该类的命名空间;
// ThinkPHP 引导文件
// 1. 加载基础文件
require __DIR__ . '/base.php’;    // 主要完成了常量定义、注册自动加载、注册错误和异常处理机制、加载惯例配置文件(convention.php)这些步骤。
// 2. 执行应用
App::run()->send();    // run()方法可以在/tp5/thinkphp/library/think/App.php文件中找到对应方法,这个方法是整个框架的核心方法,实现了路由转换、获取调度信息、根据调度信息执行相应模块控制器的方法、获取方法返回数据、将返回数据赋值给Response对象等一系列操作。最后,调用返回的Response对象的send()方法将信息返回给客户端,一次完整的http请求完成。

做了三件事:
1、定义整个框架的命名空间think
2、加载文件base.php
3、执行App类的run()方法,启动应用
而在base.php中,主要做了如下六件事:
1、定义系统常量,包括框架的运行信息、目录组织、运行环境等;
define('THINK_VERSION', '5.0.12');
define('THINK_START_TIME', microtime(true));
define('THINK_START_MEM', memory_get_usage());
define('EXT', '.php');
define('DS', DIRECTORY_SEPARATOR);
defined('THINK_PATH') or define('THINK_PATH', __DIR__ . DS);
define('LIB_PATH', THINK_PATH . 'library' . DS);
define('CORE_PATH', LIB_PATH . 'think' . DS);
define('TRAIT_PATH', LIB_PATH . 'traits' . DS);
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . DS);
defined('ROOT_PATH') or define('ROOT_PATH', dirname(realpath(APP_PATH)) . DS);
defined('EXTEND_PATH') or define('EXTEND_PATH', ROOT_PATH . 'extend' . DS);
defined('VENDOR_PATH') or define('VENDOR_PATH', ROOT_PATH . 'vendor' . DS);
defined('RUNTIME_PATH') or define('RUNTIME_PATH', ROOT_PATH . 'runtime' . DS);
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'log' . DS);
defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'cache' . DS);
defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'temp' . DS);
defined('CONF_PATH') or define('CONF_PATH', APP_PATH); // 配置文件目录
defined('CONF_EXT') or define('CONF_EXT', EXT); // 配置文件后缀
defined('ENV_PREFIX') or define('ENV_PREFIX', 'PHP_'); // 环境变量的配置前缀
// 环境常量
define('IS_CLI', PHP_SAPI == 'cli' ? true : false);
define('IS_WIN', strpos(PHP_OS, 'WIN') !== false);

2、载入Loader类(/thinkphp/library/think/Loader.php)
// 载入Loader类
require CORE_PATH . 'Loader.php';

3、加载环境变量配置文件(/.env),如果该文件不存在,就跳过;
// 加载环境变量配置文件
if (is_file(ROOT_PATH . '.env')) {
    $env = parse_ini_file(ROOT_PATH . '.env', true);
    foreach ($env as $key => $val) {
        $name = ENV_PREFIX . strtoupper($key);
        if (is_array($val)) {
            foreach ($val as $k => $v) {
                $item = $name . '_' . strtoupper($k);
                putenv("$item=$v");
            }
        } else {
            putenv("$name=$val");
        }
    }
}

4、注册自动加载
// 注册自动加载
\think\Loader::register();

5、注册错误和异常处理机制
// 注册错误和异常处理机制
\think\Error::register();

6、加载惯例配置文件
// 加载惯例配置文件
\think\Config::set(include THINK_PATH . 'convention' . EXT);

转载于:https://www.cnblogs.com/sunshineliulu/p/8484772.html

ThinkPHP5.0源码学习之框架启动流程相关推荐

  1. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  2. [Abp vNext 源码分析] - 1. 框架启动流程分析

    一.简要说明 本篇文章主要剖析与讲解 Abp vNext 在 Web API 项目下的启动流程,让大家了解整个 Abp vNext 框架是如何运作的.总的来说 ,Abp vNext 比起 ABP 框架 ...

  3. 基于8.0源码解析:startService 启动过程

    基于8.0源码解析:startService 启动过程 首先看一张startService的图,心里有个大概的预估,跟Activity启动流程比,Service的启动稍微简单点,并且我把Service ...

  4. 12.源码阅读(app启动流程-android api 26)

    activity的启动流程之前已经通过源码了解了,那么app的启动流程是怎样的,从我们按下app的图标,到应用启动起来显示出画面,中间都经历了什么? 安卓是基于java的,所以和java有一定的相似性 ...

  5. 【Debug跟踪Hadoop3.0.0源码之MapReduce Job提交流程】第三节 Job提交前的初始化

    [Debug跟踪Hadoop3.0.0源码之MapReduce Job提交流程]第三节 Job提交前的初始化 回顾 Job提交前的初始化 后记 跳转 回顾 上一节中我们对 jobSubmitter(提 ...

  6. 【Android 源码学习】Zygote启动原理

    Android 源码学习 Zygote启动原理 望舒课堂 Zygote进程启动原理学习记录整理. Zygote简介 Zygote是进程在init进程启动时创建的,进程本身是app_process,来源 ...

  7. php连接tidb,TiDB源码学习笔记:启动TiDB

    作者:院长,神州数码云基地开发工程师,目前专注于TiDB源码研究. TiDB源码研究系列第一篇,简述TiDB的核心架构,从tidb-server/mian.go开始,探索启动TiDB的方法. 最近因为 ...

  8. 【Android 源码学习】 init启动

    目录 Android 源码学习 init启动 从main.cpp开始 init.cpp 部分逻辑 init启动zygote 属性服务 总结 Android 源码学习 init启动 Android 11 ...

  9. 【Android 源码学习】SystemServer启动原理

    Android 源码学习 SystemServer启动原理 望舒课堂 SystemServer进程启动原理学习记录整理. 参考文章: Android系统启动流程(三)解析SyetemServer进程启 ...

最新文章

  1. .17-浅析webpack源码之compile流程-入口函数run
  2. php cpp,【PHP】libphpcpp.so编译
  3. foreach遍历打印表格
  4. 实现小数据量和海量数据的通用分页显示存储过程
  5. Centos 升级MySQL版本或者Yum安装Mysql5.6
  6. Ubuntu上面安装Redis Python
  7. 阿里巴巴对Java编程【OOP规约】的规约
  8. 网络服务器分为文件服务器通信服务器和,近代中国落后、贫困的根本原因是()...
  9. 梦想旅行出席中国互联网大会 做旅游界的技术派
  10. python电话通知_教你如何用Python向手机发送通知
  11. Atitit  undac网络设备管理法案 (路由器 交换机等)    法案编号USRr101510
  12. 每逢看牙好怕怕,AI 轻松搞定它
  13. Android控件组合应用四
  14. WIN10英文改中文
  15. 在idea中如何设置项目编码为UTF-8?
  16. 宽带升级后,手机能连WiFi,电脑却连不上的解决办法 TC7102WiFi
  17. 高中python编程例题-Python进入高中教学
  18. HTML5自动换行的间距设置,设置EXCEL自动换行的行与行之间的间距的办法
  19. 经典蓝牙与低功耗蓝牙的区别(转)
  20. 编程规则 - 2 命名规则

热门文章

  1. 面板数据回归模型(固定效应、随机效应、混合回归、变系数)、面板数据AR、VAR模型
  2. 0基础自学前端好,还是报班培训好?
  3. HTML5新增相关标签的和属性
  4. linuxoracle静默安装应答文件修改_巧用组策略分发软件—让IT不再手忙脚乱地奔走在各个工位安装软件...
  5. java用cookie最新浏览商品_jQuery.cookie.js实现记录最近浏览过的商品功能示例
  6. 关于excel表的生成
  7. python扫描app接口_[分享】python+requests对app和微信小程序进行接口测试
  8. 5元的小乌龟吃什么_五月最适合吃这菜,5元一斤,两三天吃一次,鲜嫩正当时好美味...
  9. mongodb连接池 php,node.js,mongodb_nodejs使用mongodb连接池,node.js,mongodb - phpStudy
  10. c语言枚举和结构体的区别,全面了解结构体、联合体和枚举类型