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);