zoukankan      html  css  js  c++  java
  • ThinkPHP5.0源码学习之框架启动流程

    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、注册自动加载
    // 注册自动加载
    hinkLoader::register();
    5、注册错误和异常处理机制
    // 注册错误和异常处理机制
    hinkError::register();
    6、加载惯例配置文件
    // 加载惯例配置文件
    hinkConfig::set(include THINK_PATH . 'convention' . EXT);
  • 相关阅读:
    IDEA控制台输出中文乱码问题
    JAVA web 框架集合
    去掉VSS控制
    .Net Core .Net Core V1.0 创建MVC项目
    .Net Core .Net Core的学习
    WebService 天气预报webservice接口
    SMS106 短信验证码接口测试
    Regex 常用的正则表达式
    Jquery Plugins Jquery Validate
    MVC 路由调试工具-RouteDebugger
  • 原文地址:https://www.cnblogs.com/sunshineliulu/p/8484772.html
Copyright © 2011-2022 走看看