详说Laravel中怎么找到最慢的查询(laravel速查表)

admin1690456年前1条评论

一淘模板问人人的网站慢吗?加载需要很永劫日吗?用户是否抱怨它多少乎 无奈应用 ?您应当检察您的数据库盘问。我将向您展现一种轻松剖析所稀有据库盘问的简洁方法。

详说Laravel 中怎么找到最慢的查询(laravel速查表) 技术教程

固然,您的网站速率慢的原因有患上多,但最罕见的原因之一是数据库盘问速率慢。

然而在laravel中,咱们(年夜少数时刻)不应用SQL从数据库中获取数据,咱们应用 EloquentORM 以及 盘问构建器 ,这偶然会以致很难查明形成咱们网站云云连忙的盘问。

DB::listen()

幸运的是,在laravel中,咱们能够界说一个在每一次实行盘问时调用的回调。为此,请将下列代码增添就任何效劳供应者(比方AppServiceProvider):

public function boot(){DB::listen(function ($query) {// TODO: make this useful});}

如您所见,咱们接受了一个变量 $query,这个变量是 QueryExecuted 类的一个实例。这象征着咱们能够访问无关已经实行盘问的一些信息:

DB::listen(function ($query) {$query->sql; // 实行的 sql 字符串$query->bindings; // 通报给sql盘问的参数(这将调换sql字符串中的 "?")$query->time; // 实行盘问所用的时日;});

这是非常实用的信息,现在咱们能够通过检察 $query->time 属性来识别慢盘问。 但这并无告知咱们在咱们的代码中盘问实行的地位

我怎么通晓盘问是在那边实行的?

即使该 $query 变量不给咱们任何对于于其泉源的信息, 咱们依然能够应用 PHP 内置函数 debug_backtrace() 获取该信息。

DB::listen(function ($query) {dd(debug_backtrace());});

如果你在你的名目上运行它,你会在浏览器上看到相似如许的货色:

array:63 [▼0 => array:7 [▼ "file"=>"/home/cosme/Documents/projects/cosme.dev/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php""line" => 404"function" => "App\Providers\{closure}""class" => "App\Providers\AppServiceProvider""object" => App\Providers\AppServiceProvider {#140 ▶}"type" => "->""args" => array:1 [▶]]1 => array:7 [▼"file" => "/home/cosme/Documents/projects/cosme.dev/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php""line" => 249"function" => "Illuminate\Events\{closure}""class" => "Illuminate\Events\Dispatcher""object" => Illuminate\Events\Dispatcher {#27 ▶}"type" => "->""args" => array:2 [▶]]2 => array:7 [▼"file" => "/home/cosme/Documents/projects/cosme.dev/vendor/laravel/framework/src/Illuminate/Database/Connection.php""line" => 887"function" => "dispatch""class" => "Illuminate\Events\Dispatcher""object" => Illuminate\Events\Dispatcher {#27 ▶}"type" => "->""args" => array:1 [▶]]....

这是一个数组,其中蕴含申请中到现在为止的每一个函数调用。我将只关注每一个数组中的 file 以及 line 键。

如果你仔细看,你会发明在我的例子中有63个函数调用,这是一个轻易的应用程序,如果在更简单的应用程序中,能够会更多。更糟糕的是,如果您检察顶部的那些, 它们都是laravel框架的外部函数。咱们是否应当逐个检察,直到找到能够对于咱们有帮助的货色?

查找盘问地位

正如我以前所说,它们中的年夜少数是外部框架调用,这象征着这些文件中的年夜少数都在咱们的 vendor/ 目录中。这象征着咱们能够检察每一个 file 并过滤失落任何拥有 vendor/ 的调用,下列所示:

DB::listen(function ($query) {$stackTrace = collect(debug_backtrace())->filter(function ($trace) {return !str_contains($trace['file'], 'vendor/');}); dd($stackTrace);});

在这里,我将数组转换为聚拢以应用该 filter 方法,如果 file 以后 $trace 有 vendor/ 咱们将其从聚拢中删除了。

如果您运行下面的代码,您将看到下列内容:

Illuminate\Support\Collection {#1237 ▼#items: array:5 [▼12 => array:7 [▼"file" => "/home/cosme/Documents/projects/cosme.dev/app/Models/Post.php""line" => 61"function" => "get""class" => "Illuminate\Database\Eloquent\Builder""object" => Illuminate\Database\Eloquent\Builder {#310 ▶}"type" => "->""args" => []]16 => array:6 [▶]17 => array:6 [▶]61 => array:7 [▶]62 => array:4 [▶]]#escapeWhenCastingToString: false}

这些名目要少患上多,咱们从63个变为为了只有5个。最佳的整体是聚拢中的第一项是咱们触发SQL盘问确实切地位。这象征着咱们能够提取该信息以找到最慢的盘问。

打印到日志

既然咱们领有了咱们需要的所有信息,为甚么不记载它以便咱们能够检察并查找最慢的盘问?:

public function boot(){DB::listen(function ($query) {$location = collect(debug_backtrace())->filter(function ($trace) {return !str_contains($trace['file'], 'vendor/');})->first(); // grab the first element of non vendor/ calls $bindings = implode(", ", $query->bindings); // format the bindings as string Log::info("------------Sql: $query->sqlBindings: $bindingsTime: $query->timeFile: ${location['file']}Line: ${location['line']}------------");});}

如果您在应用程序中应用它,您能够检察您的日志文件,您应当会看到下列盘问信息:

[2022-02-03 02:20:14] local.INFO:------------Sql: select "title", "slug", "body" from "posts" where "published" = ? order by "id" desc Bindings: 1Time: 0.18File: /home/cosme/Documents/projects/cosme.dev/app/Models/Post.phpLine: 61----------

现在您通晓哪些盘问是最慢的,并最先逐个解决它们,试验使它们更快,或者至少缓存它们。

扩年夜调试

这对于调试非常实用,但这种技术能够以多种形式应用。

您能够建立显示一周中最慢盘问的每一周汇报。

如果盘问高出时日阈值,您能够会收到松懈警报

您能够建立一个仪表板,您以及您的团队能够在其中检察实行的每一个盘问

你可能想看:

本文链接:http://addon.ciliseo.com/xiang-shuo-laravel-zhong-zen-me-zhao-dao-zui-man-de-zha-xun.html

Laravel最慢您的我们可以信息您可以函数我将的是变量如果您
您的拼音您的设备不支持googleplay服务您的呼叫发生旋转并且呼叫受限您的笔顺您的组词您的连接不是私密连接怎么解决您的设备遇到问题需要重启我们将为您重新启动您的读音您的计算机配置似乎是正确的但该设备或资源没有响应您的意思您的声音您的攻略对象已达上限您的声音纪录片您的声音观后感您的物品已到达华东仓您的物品已到达华东仓toenglish您的银行卡被拒绝了。您的英语水平如何您的账号目前无法使用搜索实验室您的帐户活动并未表明您与既有成员属于同一户人家您的设备不支持googleplay服务您的设备与此版本不兼容您的护照正在运送到使馆中您的银行卡被拒绝了。chatgpt信息恢复信息的英文信息的拼音信息泄露怎么处理方法信息系统项目管理高级信息公开网查询个人信息技术基础知识信息安全信息删了怎么能找回短信的信息信息工程大学信息化管理系统平台171221172908001官网信息化管理系统平台官网登录入口信息公示系统企业信息查询信息化管理系统平台171221172908001信息管理系统平台登录入口官网网址信息化管理系统平台171221172908001最新版本信息系统项目管理师信息化管理系统平台登录入口信息技术信息管理系统信息茧房信息熵信息茧房英文信息论信息素信息素独占信息差信息rcs是什么意思信息素说我们不可能

网友评论

  • 2025-03-1811:11:05

    我们可以共创美好的未来,一起向前迈进。

扫一扫二维码添加客服微信

关于我们建站招商建站服务