使用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
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章