建立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 }