thinkphp6实现统一监听并记录所有执行的sql语句除查询外

  1. 创建文件app/middleware/SqlLogger.php

namespace app\middleware;

use think\facade\Db;
use think\facade\Session;

class SqlLogger
{
    public function handle($request, \Closure $next)
    {
        // 监听所有SQL $request->ip()
        Db::listen(function($sql, $time) {
            if (preg_match('/^(INSERT|UPDATE|DELETE|REPLACE)/i', $sql)) {
                $log = [
                    'user_id' => Session::get('userid', 'guest'),
                    'sql'     => $sql,
                    'time'    => date('Y-m-d H:i:s'),
                    'ip'      => '127.1.1.1'
                ];
                file_put_contents("D:/phpstudy_pro/WWW/sql.log", json_encode($log)."\n", FILE_APPEND);
            }
        });

        return $next($request);
    }
}

?>
  1. 打开app/middleware.php文件并注册该中间件

// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
    \think\middleware\SessionInit::class,
    //跨中间件
    \think\middleware\AllowCrossDomain::class,
    \app\middleware\SqlLogger::class
];
  1. 最终效果:执行修改sql后,会自动触发该方法

你可能感兴趣的:(thinkphp5,php,sql,php)