You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Yii中CreateCommand的SQL并低侵入式记录执行SQL

Yii框架低侵入式记录所有执行的SQL

核心思路:利用Yii数据库组件的事件机制

Yii的Connection类内置了beforeExecute事件,每次执行SQL前都会触发该事件。我们可以通过给db组件附加一个Behavior来监听这个事件,无需修改业务代码就能自动获取并记录所有执行的SQL。

步骤1:创建数据库日志Behavior

在app/components目录下新建DbLogBehavior.php,代码如下:

<?php
namespace app\components;

use yii\base\Behavior;
use yii\db\Connection;

class DbLogBehavior extends Behavior
{
    // 声明要监听的事件
    public function events()
    {
        return [
            Connection::EVENT_BEFORE_EXECUTE => 'logSql',
        ];
    }

    // 事件处理方法
    public function logSql($event)
    {
        $command = $event->sender;
        // 获取带占位符的原始SQL
        $rawSql = $command->sql;
        // 获取绑定的参数
        $params = $command->params;
        // 获取替换参数后的最终执行SQL(推荐记录这个,方便直接调试)
        $fullSql = $command->getRawSql();

        // 按需记录:可写入Yii日志、自定义文件或数据库
        \Yii::info("执行SQL: {$fullSql}", 'db_sql');
        // 如需记录参数,可追加以下代码
        // \Yii::info("SQL参数: " . json_encode($params), 'db_sql');
    }
}

步骤2:给Db组件附加Behavior

在项目配置文件(如config/web.php或config/main.php)的components区块中,给db组件添加Behavior配置:

return [
    // ...其他全局配置
    'components' => [
        'db' => [
            'class' => 'yii\db\Connection',
            'dsn' => 'mysql:host=localhost;dbname=your_db',
            'username' => 'your_user',
            'password' => 'your_pwd',
            'charset' => 'utf8mb4',
            // 附加日志Behavior
            'as dbLog' => [
                'class' => 'app\components\DbLogBehavior',
            ],
        ],
        // ...其他组件配置
    ],
];

效果说明

配置完成后,不管业务代码里是用Yii::$app->db->createCommand($sql)->queryAll(),还是用ActiveRecord的查询方法,所有执行的SQL都会被自动记录到Yii的日志系统中。默认日志文件在runtime/logs/app.log,也可以配置日志组件将db_sql分类的日志单独输出到指定文件。

内容的提问来源于stack exchange,提问作者zzllmejxt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:05:01