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

摘要:
在程序中使用框架类时,应首先使用类的名称空间//ThinkPHP启动文件//1.加载所需的基本文件_DIR__。'/基础php';//它主要完成常量定义、注册自动加载、注册错误和异常处理机制以及加载约定配置文件//2.执行应用程序App::run()-˃send()//run()方法可以在/tp5/thinkphp/library/hint/App中找到相应的方法可以在PHP文件中找到。该方法是整个框架的核心方法。它实现了路由转换、获取调度信息、根据调度信息执行相应模块控制器的方法、获取方法返回数据以及将返回的数据分配给Response对象等一系列操作。
ThinkPHP5框架的启动流程图如下:
ThinkPHP5.0源码学习之框架启动流程第1张
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、注册自动加载
// 注册自动加载
hinkLoader::register();
5、注册错误和异常处理机制
// 注册错误和异常处理机制
hinkError::register();
6、加载惯例配置文件
// 加载惯例配置文件
hinkConfig::set(include THINK_PATH . 'convention' . EXT);

免责声明:文章转载自《ThinkPHP5.0源码学习之框架启动流程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇服务器的Redis连接不上解决方案Android ImageView点击效果下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Yii和ThinkPHP对比心得

本人小菜鸟一只,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,服务器)等一系列的知识,小菜鸟创建了一个群。希望光临本博客的人可以进来交流。寻求共同发展。搭建平台。 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。 QQ群: 281442983 (点击链接加入群:http://jq.q...

小米平板7.0系统如何不root激活Xposed框架的方法

在越来越多公司的引流或业务操作中,基本都需要使用安卓的强大XPOSED框架,这段时间我们公司买来了一批新的小米平板7.0系统,基本都都是基于7.0以上版本,基本都不能够获取root超级权限,即使小部分能够但很是麻烦,甚至也有获取root超级权限后重启设备就恢复无root状态的情况发生,很是头大的一件事,导致没有办法正常激活XPOSED框架,从而越来越多模块...

【推荐】HTML5 UI框架 推荐

笔者的男装网店:http://shop101289731.taobao.com 。冬装,在寒冷的冬季温暖你。新品上市,环境选购 最近自己瞎搞一下web网页的东西。想开发先找资源。 整理了一下HTML5的比较给力的UI开源框架: 1.Kendo UI : 官网地址: http://www.kendoui.com/ 推荐指数:★★★★☆ KendoUI是一款开...

DevExpress源码编译总结

独家提供完整可编译sln文件,本篇文章内容包括基础知识(GAC、程序集强签名、友元程序集)、编译过程、注册GAC、添加工具箱、多语言支持、运行时和设计时调试 源码地址链接:http://pan.baidu.com/s/1miNCHug密码:rlyr关于编译源码,前前后后折腾了太久,自己折腾,到官网折腾,到DXPER折腾,今天,总算有个结局了 编译环...

APP的UI自动化测试框架及平台化探索

顾铮,10年+测试及测试开发相关经验,2014年加入京东,曾主导设计开发UI测试框架,参与CI测试平台建设,现负责iOS侧的工具,框架建设。在UI自动化,性能测试,单元测试方面有较深入研究,在App,web端等有较丰富的测试开发和设计经验。 >>>> 写在前面 关于UI测试的文章,多数是通过架构的演进,或是重构,或是推翻重做来讲述的...

layui.js源码分析

/*! @Title: Layui @Description:经典模块化前端框架 @Site: www.layui.com @Author: 贤心 @License:MIT */ ;!function(win) { "use strict"; var Lay = function() { this.v...