萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

Yii 2.0 開啟調試模式查看 SQL 執行語句完整教程

核心配置:開啟 CWebLogRoute

修改 protected/config/main.php (或 config/web.php),在 components.log.routes 添加 CWebLogRoute:

<?php
return [
    'components' => [
        'log' => [
            'class' => 'CLogRouter',
            'routes' => [
                // 文件日誌 (生產環境建議保留)
                [
                    'class' => 'CFileLogRoute',
                    'levels' => 'trace, info, error, warning',
                    'categories' => 'system.*',
                    'logFile' => 'application.log',
                ],
                // 網頁顯示 SQL (僅開發環境)
                [
                    'class' => 'CWebLogRoute',
                    'levels' => 'trace',           // 關鍵:只捕獲 trace 級別
                    'categories' => 'system.db.*', // 關鍵:只顯示數據庫相關
                    'showInFireBug' => false,      // 不在 FireBug 顯示
                ],
            ],
        ],
        'db' => [
            'class' => 'CDbConnection',
            'connectionString' => 'mysql:host=localhost;dbname=test',
            'username' => 'root',
            'password' => '',
            'charset' => 'utf8',
            'enableParamLogging' => true,  // 顯示參數綁定值
            'enableProfiling' => true,     // 啟用性能分析
        ],
    ],
];

效果展示

頁面底部將顯示調試工具欄,包含:

  • 執行時間、記憶體佔用
  • SQL 語句列表:完整 SQL、綁定參數、執行耗時、所在文件行號
  • 查詢次數統計、重複查詢提醒

進階:Yii Debug Toolbar (推薦)

安裝官方擴展:

composer require --dev yiisoft/yii2-debug

配置 config/web.php:

$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
    'class' => 'yii\debug\Module',
    'allowedIPs' => ['127.0.0.1', '::1', '192.168.*.*'], // 安全:限制訪問 IP
];

功能更強大:請求時間線、SQL EXPLAIN 分析、郵件預覽、資源佔用圖表、請求重放。

生產環境安全警示

⚠️ 嚴禁在生產環境開啟 CWebLogRoute 或 Yii Debug Toolbar!會洩露 SQL、參數、環境變量、堆疊追蹤等敏感信息,且嚴重影響性能。

  • 生產環境僅保留 CFileLogRoute 記錄錯誤/警告
  • 使用 YII_ENV_DEV 環境變量區分配置:
<?php
// config/web.php
$config = [...];
if (YII_ENV_DEV) {
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = ['class' => 'yii\debug\Module'];
    $config['components']['log']['routes'][] = [
        'class' => 'yii\log\FileTarget',
        'levels' => ['trace'],
        'categories' => ['yii\db\*'],
    ];
}
return $config;

手動代碼中輸出 SQL (不依賴調試面板)

<?php
// 1. 獲取最後執行的 SQL (含參數綁定)
$sql = Yii::app()->db->getLastSql();  // Yii 1.x
// 或
$sql = Yii::$app->db->getLastSql();   // Yii 2.x

// 2. 開啟 Profiling 獲取詳細信息
Yii::app()->db->enableProfiling = true;
// ... 執行查詢 ...
$profiles = Yii::app()->db->getProfiles();
foreach ($profiles as $profile) {
    echo "SQL: {$profile->query}\n";
    echo "耗時: {$profile->duration} 秒\n";
    echo "參數: " . print_r($profile->params, true) . "\n";
}

// 3. 直接在 SQL 中輸出調試 (臨時)
$users = User::model()->findAllBySql('SELECT * FROM user WHERE id = :id', [':id' => 1]);

常見問題

不顯示 SQL?
檢查 levels => 'trace'、categories => 'system.db.*'、enableParamLogging => true、YII_DEBUG 常量定義
參數顯示為 ?
確保 enableParamLogging => true (Yii 1.x) 或 enableProfiling => true (Yii 2.x)
性能極慢
調試面板收集大量數據會拖慢請求,僅開發環境開啟,生產環境關閉
copyright © 萬盛學電腦網 all rights reserved