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