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);
  • 相关阅读:
    HDU 2852 KiKi's K-Number (主席树)
    HDU 2089 不要62
    Light oj 1140 How Many Zeroes?
    Bless You Autocorrect!
    HDU 6201 transaction transaction transaction
    HDU1561 The more ,The better (树形背包Dp)
    CodeForces 607B zuma
    POJ 1651 Mulitiplication Puzzle
    CSUOJ 1952 合并石子
    Uva 1599 Ideal path
  • 原文地址:https://www.cnblogs.com/sunshineliulu/p/8484772.html
Copyright © 2011-2022 走看看