Yii2出现Headers Already sent错误,尝试所有方案均无法解决求指导
Yii2 Headers Already sent错误解决方案
错误原因
- 自定义的响应方法违背了Yii2原生的响应处理流程,手动调用
header()、echo、die会打乱框架的输出逻辑 - 手动操作输出缓冲
ob_*系列方法可能和Yii2自带的缓冲机制冲突 - 代码中存在提前输出的内容(比如文件首尾空格、前置输出语句)也会触发该错误
可行修复方案
方案1:使用Yii2原生响应组件(推荐,无需终止执行)
重写你的sendJsonResponse方法,完全交由Yii处理响应头和输出:
/** * Send given object as json object * * @param array $data * @return \yii\web\Response */ public function sendJsonResponse($data) { $response = \Yii::$app->response; // 清空响应对象中已有的内容和头信息 $response->headers->removeAll(); $response->content = ''; // 设置响应格式为JSON,Yii会自动发送Content-Type: application/json头 $response->format = \yii\web\Response::FORMAT_JSON; $response->data = $data; return $response; }
调用方式保持不变即可:
return $this->sendJsonResponse(['message'=>'Some message here','status'=>true]);
方案2:需要提前终止后续代码执行的场景
如果调用返回JSON后不需要执行后续控制器逻辑,可以用以下写法:
/** * Send given object as json object and terminate execution * * @param array $data * @return void */ public function sendJsonResponse($data) { $response = \Yii::$app->response; $response->headers->removeAll(); $response->content = ''; $response->format = \yii\web\Response::FORMAT_JSON; $response->data = $data; // 手动发送响应 $response->send(); // 安全终止应用,不会产生额外输出 \Yii::$app->end(); }
调用时无需return,直接执行方法即可:
$this->sendJsonResponse(['message'=>'Some message here','status'=>true]);
额外排查项
如果修改方法后仍报错,需要排查以下问题:
- 所有自定义PHP文件(控制器、配置、公共函数文件等)
<?php标签前不能有空格、换行、UTF-8 BOM头,且文件末尾不要写?>标签,避免标签后产生多余输出 - 调用
sendJsonResponse方法前不能有任何输出语句,包括var_dump、echo、print_r以及PHP报错信息输出 - 不要在业务代码中手动调用
header()、setcookie()等发送头信息的原生方法,所有头信息都通过\Yii::$app->response->headers->set()方法设置
内容的提问来源于stack exchange,提问作者Aditya
相关产品推荐
相关产品推荐

