billy
(Pchye)
1
我控制器里 返回 json格式
echo CJSON::encode($result);
Yii::app()->end();
如果开启了 调试 程序日志 ,返回信息会自动加上
{"state":"1","msg":"c\/4f852c305ea47.jpg"}<!-- start log messages -->
<table class="yiiLog" width="100%" cellpadding="2" style="border-spacing:1px;font:11px Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;color:#666666;">
<tr>
<th style="background:black;color:white;" colspan="5">
程序日志
</th>
</tr>
<tr style="background-color: #ccc;">
<th style="width:120px">时间</th>
<th>等级</th>
<th>类别</th>
<th>信息</th>
</tr>
。。。。。省略此处。。。。
</tr></table>
<!-- end of log messages -->
请问qiang哥怎么处理这个问题呢,
如果关闭了调试就没问题了
yiqing95
(Yiqing 95)
2
对于新手 我对你的回答不知道算不算难 可以扩展CWebApplication 复写end 方法 在其中检测当前请求是不是ajax 如果是那么 用die 如果不是什么都不做 你可以查看原始实现:
public function end($status=0, $exit=true)
{
if($this->hasEventHandler('onEndRequest'))
$this->onEndRequest(new CEvent($this));
if($exit)
exit($status);
}
可以看到区别于exit的是 加了个事件触发 对于某些扩展 可能会监听onEndRequest 事件 那么他们如果有某些输出 就会破坏掉原始的json结构的
所以可以不要让那些事件监听者输出东西或者 直接用die/exit 就行 ; 如果你打算自己复写CWebApplication类 那么可以这么做:
public function end($status = 0, $exit = true)
{
$request = $this->getRequest();
if ($request->getIsAjaxRequest()) {
if ($this->hasEventHandler('onEndRequest')) {
ob_start();
ob_implicit_flush(false);
$this->onEndRequest(new CEvent($this));
$cached = ob_get_clean();
}
if ($exit) exit($status);
} else {
parent::end($status, $exit);
}
}
就是捕获php的缓冲输出而已 如果你嫌麻烦 那么直接用exit 代替Yii::app()->end() ; 也行 论坛上发现好多人都这么干的 
billy
(Pchye)
3
3QU,目前我都是用die的方法了,哥们你这么认真回答我,小弟感激不尽,我以为Yii有自带的方法,所以贴出来就问问
手动把日志关闭
foreach(Yii::app()->log->getRoutes() as $route)
$route->enabled=false;
。。。
echo CJSON::encode($result);