报错内容
exception 'yii\web\HeadersAlreadySentException' with message 'Headers already sent in E:\project\components\BaseController.php on line 112.' in E:\project\vendor\yiisoft\yii2\web\Response.php:366
Stack trace:
#0 E:\project\vendor\yiisoft\yii2\web\Response.php(339): yii\web\Response->sendHeaders()
#1 E:\project\vendor\yiisoft\yii2\web\ErrorHandler.php(135): yii\web\Response->send()
#2 E:\project\vendor\yiisoft\yii2\base\ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\web\HeadersAlreadySentException))
#3 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\HeadersAlreadySentException))
#4 {main}
Previous exception:
exception 'yii\web\HeadersAlreadySentException' with message 'Headers already sent in E:\project\components\BaseController.php on line 112.' in E:\project\vendor\yiisoft\yii2\web\Response.php:366
Stack trace:
#0 E:\project\vendor\yiisoft\yii2\web\Response.php(339): yii\web\Response->sendHeaders()
#1 E:\project\vendor\yiisoft\yii2\base\Application.php(656): yii\web\Response->send()
#2 E:\project\components\BaseController.php(113): yii\base\Application->end()
#3 E:\project\controllers\ClueController.php(329): app\components\BaseController->backToJson(0, Array, '\xE6\x93\x8D\xE4\xBD\x9C\xE6\x88\x90\xE5\x8A\x9F')
#4 [internal function]: app\controllers\ClueController->actionAjaxlist()
#5 E:\project\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
#6 E:\project\vendor\yiisoft\yii2\base\Controller.php(157): yii\base\InlineAction->runWithParams(Array)
#7 E:\project\vendor\yiisoft\yii2\base\Module.php(528): yii\base\Controller->runAction('ajaxlist', Array)
#8 E:\project\vendor\yiisoft\yii2\web\Application.php(103): yii\base\Module->runAction('clue/ajaxlist', Array)
#9 E:\project\vendor\yiisoft\yii2\base\Application.php(386): yii\web\Application->handleRequest(Object(yii\web\Request))
#10 E:\project\web\index.php(20): yii\base\Application->run()
#11 {main}
报错原因
在action中运行echo,var_dump等方法后没有中断,yii1.0中Ajax方法返回数据可以直接通过echo获取,但是yii2.0的Response类中增加了对于返回输出信息的定义,所以当echo后没有中断程序,yii自带的代码就会出错,不过目前我发现的情况是,只有在返回的数据结构复杂的情况下才会出错,尤其是数据中存在json字符串这种形式。
解决方案
- 在echo输出给页面信息后,打断点
- 用return代替echo等输出
public fucntion actionTest()
{
//此方法为ajax访问方法
$data = array(
'a' => 1,
'b' => json_encode(array(1,2,3))
);
echo json_encode($data);die;//这种方法是可行的,也是yii1.0中常用的输出方法
return json_encode($data);//这种方法也能得到数据,这里推荐使用这种方法
}
注
有两个问题我没有搞清楚原因是什么:
- 简单的数组为什么可以正常输出,复杂的数组输出就会有问题
- 为什么在浏览器直接访问方法并不会报错,用Ajax调用就会报错