如何获取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
相关产品推荐
相关产品推荐

