1. 程式人生 > >Yii列印當前請求所有執行的SQL及耗時

Yii列印當前請求所有執行的SQL及耗時

我們在熟悉新的專案瞭解業務的時候,可以有很多方式。看專案文件說明;和了解專案身邊的人溝通;通過自己度程式碼除錯,但是一步步除錯列印語句或許有點慢,如果可以調出當前請求的所有語句,那麼很快可以熟悉他的業務。再或者自己開發中排查問題。

公司所用的框架是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頁面列印效果會不會美觀些。

[第二種]

 在yii框架的libs目錄下,找到/libs/framework/db/CDbCommand.php檔案

然後找到兩個方法,queryInternal和execute方法​​,編輯方法,echo 出sql語句。