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