请问qiang哥当返回json时候,又开启了调试模式出现的问题

我控制器里 返回 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;">

&lt;tr&gt;


	&lt;th style=&quot;background:black;color:white;&quot; colspan=&quot;5&quot;&gt;


		程序日志


	&lt;/th&gt;


&lt;/tr&gt;


&lt;tr style=&quot;background-color: #ccc;&quot;&gt;


    &lt;th style=&quot;width:120px&quot;&gt;时间&lt;/th&gt;


	&lt;th&gt;等级&lt;/th&gt;


	&lt;th&gt;类别&lt;/th&gt;


	&lt;th&gt;信息&lt;/th&gt;


&lt;/tr&gt;


。。。。。省略此处。。。。


&lt;/tr&gt;&lt;/table&gt;

<!-- end of log messages -->

请问qiang哥怎么处理这个问题呢,

如果关闭了调试就没问题了

对于新手 我对你的回答不知道算不算难 可以扩展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() ; 也行 论坛上发现好多人都这么干的 :lol:

3QU,目前我都是用die的方法了,哥们你这么认真回答我,小弟感激不尽,我以为Yii有自带的方法,所以贴出来就问问

手动把日志关闭




		foreach(Yii::app()->log->getRoutes() as $route)

			$route->enabled=false;


	。。。

echo CJSON::encode($result);