框架启动流程为:入口加载自动加载器→实例化App并初始化容器→HTTP应用运行并绑定Request→路由调度匹配控制器→生成响应并执行收尾。各环节需验证关键类存在、服务绑定、对象类型及事件触发。

一、入口文件加载与自动加载机制初始化
当用户发起 HTTP 请求时,Web 服务器将请求路由至 public/index.php 入口文件,框架由此启动。该文件首要任务是引入 Composer 自动生成的自动加载器,为后续类文件的按需加载奠定基础。
1、打开 public/index.php 文件。
2、确认存在 require __DIR__.'/../vendor/autoload.php'; 语句。
3、检查 vendor/autoload.php 是否可被正常包含,若报错 Class 'Composer\Autoload\ClassLoader' not found,则说明 Composer 未正确安装或 autoload.php 损坏。
立即学习“PHP免费学习笔记(深入)”;
4、验证自动加载是否生效:在 index.php 末尾临时添加 var_dump(class_exists('think\App'));,访问页面应输出 bool(true)。
二、应用实例化与容器初始化
框架通过 new App() 构造应用对象,该操作同时完成容器(Container)的创建与核心服务绑定,确保所有组件可通过依赖注入方式获取。
1、定位 think\App 类定义位置,通常位于 vendor/topthink/framework/src/think/App.php。
2、观察其构造函数,确认 $this->bind 数组中已预置 'http' => Http::class 等关键绑定项。
3、检查 __construct 方法内是否执行了 $this->initializeContainer() 或等效逻辑,若容器未初始化,后续调用 app('http') 将返回 null 或触发异常。
4、在 App 实例化后插入调试代码:var_dump(app()->has('config'), app()->has('request'));,二者均应为 true。
三、HTTP 应用运行与请求对象绑定
App 实例生成 HTTP 应用对象并执行 run() 方法,该过程会创建 Request 实例、解析请求参数,并将其注册进容器,供后续各环节使用。
1、在 index.php 中查找 $http = (new App())->http; 行,确认 $http 是 think\Http 类型实例。
2、进入 Http::run() 方法,追踪其内部是否调用了 $this->app->make('request') 或等效方式获取请求对象。
3、检查 runWithRequest() 方法中是否执行了 $this->app->bind('request', $request),若 Request 未绑定至容器,控制器中无法通过依赖注入获取 request 实例。
4、在 runWithRequest 开头添加日志:Log::info('Request bound: '.get_class($request));,验证日志中是否输出 think\Request。
四、路由调度与控制器执行准备
HTTP 应用执行 dispatchToRoute 方法,触发路由加载、匹配及调度流程,最终确定待执行的控制器与操作方法,并为控制器实例化做前置准备。
1、进入 Http::dispatchToRoute() 方法,确认是否调用 $this->app->make('route') 获取路由实例。
2、检查 Route::dispatch() 内部是否执行了 parseUrl() 解析当前 URL 路径,提取 controller 与 action 名称。
3、验证 dispatch 方法是否返回一个 think\route\Dispatch 对象,且其属性中包含 controller 和 action 字段值。
4、在 Route::dispatch() 返回前插入断点:var_dump($dispatch->getController(), $dispatch->getAction());,若二者为空字符串,说明路由未匹配成功,将回退至默认控制器。
五、响应发送与请求生命周期收尾
控制器方法执行完毕后,框架生成 Response 对象并通过 send() 方法输出内容,随后调用 end() 完成日志记录、中间件 end 回调等收尾工作。
1、确认控制器方法返回值是否为 think\Response 实例或可被自动封装为 Response 的数据(如数组、字符串)。
2、在 index.php 中 $response->send(); 执行前添加 header('X-Response-Type: '.get_class($response));,检查响应头是否含该字段。
3、跟踪 Http::end($response) 方法,确认其是否调用 $this->app->middleware->end($response) 并触发 HttpEnd 事件。
4、检查 runtime/log/ 目录下当日日志文件,若无 HttpEnd 事件记录,说明 end 流程未完整执行,可能存在异常中断。



















