thinkphp 6 中控制器 return 响应对象时框架自动调用 send(),中间件等非控制器场景需手动调用;send() 后不可再修改状态码、header 或内容,所有设置必须在其前完成。

控制器里 return 响应对象时,send() 由框架自动调用
ThinkPHP 6 中,你在控制器方法里写 return response()->json(['data' => 1]),框架会在返回后自动调用 send() —— 这是安全且推荐的做法。前提是没提前 exit、die 或其他输出(比如 echo),否则响应流程被中断,send() 根本不会执行。
常见错误现象:return response()->json(...) 后浏览器空白、curl 看不到 body、状态码却是 200。大概率是你在 return 前触发了输出(例如日志写入时用了 echo)或中间件里误写了 exit。
- 控制器中不要手动调用
send(),否则可能重复发送,导致 “Headers already sent” 错误 - return 的必须是
Response实例,不能是数组或字符串,否则框架不识别,也不会自动 send - 如果用了
throw new HttpException(404),异常处理流程会生成新的Response并 return,同样走自动 send
中间件、事件、钩子等非控制器场景必须手动调用 send()
在中间件的 handle() 方法里、think\ResponseSend 事件回调里、或者自定义命令中直接构建响应(比如做健康检查接口),response() 只创建对象,不输出。此时必须显式加 ->send(),否则请求挂起、客户端收不到任何响应体。
典型错误:中间件里写 response()->code(401)->header('WWW-Authenticate', '...') 却没 ->send(),结果浏览器卡住或超时,Nginx 日志里出现 “upstream prematurely closed connection”。
- 中间件中调用
send()后,务必return $response或return Response::create(...)->send(),否则后续中间件仍会继续执行,可能覆盖响应 - 不要在
handle()开头就send()—— 此时业务逻辑还没跑,$response->getStatusCode()还是默认 200 - 若需拦截并终止请求(如鉴权失败),应在
send()后立即return $response,避免流程继续
send() 调用后不能再修改状态码、Header 或内容
$response->send() 不是“打印一下”,而是把整个 HTTP 协议帧(状态行 + Header + Body)一次性推给 SAPI 层。一旦执行,PHP 就失去对响应的控制权 —— 类似邮局已盖戳发信,你不能再拆封改地址。
错误操作示例:$response->send(); $response->header('X-Foo', 'bar');,这行 header 设置完全无效;同理,再调用 $response->code(500) 也改不了已发出的状态码。
- 所有 header、cookie、状态码设置必须在
send()之前完成 - 想在最后动态压缩或加水印?监听
think\ResponseSend事件,在EVENT_BEFORE_SEND钩子里操作,这是最后合法时机 - Swoole 模式下尤其敏感:复用 worker 进程时,残留的 header 输出会导致后续请求响应错乱
入口文件 public/index.php 是 send() 的最终落点
看源码就知道,public/index.php 末尾那句 $response->send() 是整个请求生命周期里最确定的出口。即使你没在控制器或中间件里显式 send,只要流程走到这里,框架就会兜底执行。
但别依赖这个兜底:如果你在中间件里提前 return response()->redirect(...),这个 redirect 响应对象不会被 index.php 的 send() 处理,而是在中间件 return 后由框架自动 send —— 所以是否兜底,取决于你 return 的时机和对象类型。
- 入口文件的
$response->send()只处理$http->run()返回的那个响应对象 - 如果你在中间件里
return response()->json(),框架会截获该对象并立即 send,不再走 index.php 那一行 - 自定义 CLI 命令或异步任务里用到
response(),必须自己send(),因为压根不经过 index.php
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











