使用DB::listen查找慢SQL

 

 

建立debug 中间件测试sql 效率

/**
     * 调试中间件.
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure                 $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        if (!env('APP_DEBUG') ) {
            return $next($request);
        }

        $startTime    = microtime(true);

        $sqlDebugInfo = [];
        $counter      = 0;
        $totalTime    = 0;
        \DB::listen(function ($query) use (&$sqlDebugInfo, &$counter, &$totalTime) {
            $query = json_decode(json_encode($query), true);//将对象强制转为数组

            if (is_array($query['bindings']) || is_object($query['bindings'])) {
                $bingdingsCopy = $query['bindings'];
                foreach ($bingdingsCopy as &$value) {
                    if (!is_scalar($value)) {
                        $value = json_encode($value);
                    }
                    if (is_string($value)) {
                        $value = "'{$value}'";
                    }
                }
//                $info['_sql_']   = str_replace_array('\?', $query['bindings'], str_replace('?', '\'?\'', $query['sql']));
                $info['_sql_'] = str_replace_array('\?', $bingdingsCopy, $query['sql']);
            }

            $info['details'] = $query;
            $sqlDebugInfo[]  = $info;
            $counter++;
            $totalTime += $query['time'];
        });

        /**
         * @var Response
         */
        $response = $next($request);
        $content  = $response->getContent();
        $content  = json_decode($content, true);

        $content['app_debug']  = true;
        $content['request']    = $request->all();
        $content['sql']        = [
            'count' => '共执行了 ' . $counter . ' 条SQL语句',
            'time'  => 'SQL总耗时 ' . $totalTime . ' ms',
            'info'  => $sqlDebugInfo,
        ];

        $content['total_time'] = (microtime(true) - $startTime) * 1000 . 'ms';

        $response->setContent(json_encode($content));//这里要求是json  所以转义了一下

        return $response;


//参考
\DB::listen(function ($query){
           $sql = $query->sql;
           $bindings = $query->bindings;
           $time = $query->time;
            if($time>10){  //when time > 10 print
               \Log::debug(var_export(compact(['sql','bindings','time']),true));
            }
       });
————————————————
版权声明:本文为CSDN博主「itchuan.net(其实)」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_37390744/article/details/88540740
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值