我們在熟悉新的專案瞭解業務的時候,可以有很多方式。看專案文件說明;和了解專案身邊的人溝通;通過自己度程式碼除錯,但是一步步除錯列印語句或許有點慢,如果可以調出當前請求的所有語句,那麼很快可以熟悉他的業務。再或者自己開發中排查問題。
公司所用的框架是yii,由於專案比較早了,好像是13年開始的,所以我的測試版本是yii1,我所嘗試的除錯也是直接搜了很多帖子,在專案中實踐可用,應該是相容1和2版本的。
[第一種]
①修改 index.php 開啟除錯模式
//index.php
//開啟除錯模式
defined('YII_DEBUG') or define('YII_DEBUG',true);
//設定日誌記錄級別,YII_TRACE_LEVEL的數字越大,資訊越清楚
defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);
②修改配置檔案 main.php
預設的日誌是輸出到protected/runtime/application.log
如果需要修改那麼需要在main.php裡面的components下面增加log配置,如下:
'preload' => array('log'),//這句也必須加上
在 Yii 中,有下列幾種日誌路由可用:
CDbLogRoute: 將資訊儲存到資料庫的表中。
CEmailLogRoute: 傳送資訊到指定的 Email 地址。
CFileLogRoute: 儲存資訊到應用程式 runtime 目錄中的一個檔案中。
CWebLogRoute: 將 資訊 顯示在當前頁面的底部。
CProfileLogRoute: 在頁面的底部顯示概述(profiling)資訊。
注:資訊路由發生在當前請求週期最後的 onEndRequest 事件觸發時。 要顯式終止當前請求過程,請呼叫 CApplication::end() 而不是使用 die() 或 exit(),因為 CApplication::end() 將會觸發 onEndRequest 事件, 這樣資訊才會被順利地記錄。
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array (
//log error
array (
'class'=>'FileDailyLogRoute',
'levels'=>'error, warning',
'logFile'=>'api_php_error.log',
'keepDays'=>7,
'logPath'=>'/data/logs/api',
),
//下面兩個陣列是我自己的配置,上面是公司專案自帶的,不必例會
//請求後在瀏覽器展示
// array (
// 'class' => 'CWebLogRoute',
// 'showInFireBug' => true,
// 'ignoreAjaxInFireBug' => true,
// 'levels' => 'trace', //級別為trace
// 'categories' => 'system.db.*' // //只顯示關於資料庫資訊,包括資料庫連線,資料庫執行語句
// ),
array (
'class' => 'CProfileLogRoute',
'levels' => 'trace',
'showInFireBug' => true,
'ignoreAjaxInFireBug' => true,
'categories' => 'system.db.* '
)
)
),
配置好之後,重新整理請求頁面就可以了,我這裡除錯的是api介面,所以看著比較不舒服,沒試過web頁面列印效果會不會美觀些。
我所在公司的二級配置地址是 protected/config/config.api.edaijia.cc api
'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error, warning', ), array( 'class'=>'CWebLogRoute', //在頁面下方輸出 主要使用此日誌類 'categories'=>'system.db.*',//日誌分類 ), ), ),
[第二種]
在yii框架的libs目錄下,找到/libs/framework/db/CDbCommand.php檔案
然後找到兩個方法,queryInternal和execute方法,編輯方法,echo 出sql語句。
這裡編輯queryInternal方法524行。
echo '<pre>'; echo $this->getText().$par; print_r($this->_paramLog);