ThinkPHP 请求流程始于 public/index.php:加载自动加载器、实例化 App 容器并调用 http->run() 启动 HTTP 内核;Http::run() 解析请求、经 Pipeline 中间件管道(洋葱模型)、路由匹配 Dispatch、容器实例化控制器并执行,最终返回响应。

ThinkPHP 源码阅读不靠堆代码,而靠抓主干。真正决定一个请求“怎么走、走到哪、谁干活”的,就那几处关键文件和方法。下面直奔核心,不绕弯。
入口文件:public/index.php 是总开关
这是所有请求的起点,真实代码就5–6行:
-
require autoload.php:靠 Composer 自动加载机制,让
think\App这类类名一出现就能被找到并载入,不用手动 include。 -
(new App())->http:触发容器的
__get魔术方法,动态创建并返回think\Http实例——它就是处理 HTTP 请求的内核。 - $http->run():真正启动整个请求生命周期,从解析、中间件、路由到控制器执行,全在这里展开。
- $response->send():把响应头和响应体(HTML/JSON等)真正输出到浏览器,不是 echo,是封装了状态码、Header、缓冲控制的完整发送。
HTTP 内核:think\Http::run() 是流程引擎
这个方法不长,但它是整条链路的调度中枢。它内部做了三件确定性的事:
- 用
Request对象解析原始$_SERVER和$_GET/$_POST,统一成面向对象的请求实例; - 把请求塞进
Pipeline(管道),挨个过中间件,每道中间件可放行、中断或改写请求/响应; - 中间件通关后,交由
Route路由解析 URL,匹配出控制器类和方法,并准备参数注入。
中间件与管道:Pipeline 是请求的安检通道
ThinkPHP 的中间件不是装饰器式写法,而是基于“洋葱模型”的管道调度:
立即学习“PHP免费学习笔记(深入)”;
-
Pipeline::send($request)->then(...)启动执行流; -
through([...])注册中间件数组,顺序执行,支持前置、后置逻辑; - 每个中间件接收
$request和$next(下一个中间件闭包),调用$next($request)才继续向下; - 异常发生时,
whenException()可捕获并转交错误处理器,不影响主流程结构。
路由与控制器:最后落地业务的地方
路由不是静态映射表,而是运行时动态解析:
-
think\Route根据 URL pathinfo、请求 method、域名、子域名等多维条件匹配规则; - 匹配成功后,生成
Dispatch对象,明确指定要执行的控制器类、方法、参数; - 控制器类由容器自动实例化,支持构造函数注入、方法参数自动绑定(如 Request、Response、验证器等);
- 控制器方法返回值(字符串、数组、View 对象、Response 对象)会被自动转换为最终响应内容。
不复杂但容易忽略:TP8 把“应用初始化”和“请求处理”彻底分离。App 容器启动时只做环境、配置、服务注册;真正每个请求进来,才跑 Pipeline → Route → Controller 这一套。这种设计让并发更轻、内存更省、扩展更干净。



















