検索
ホームページPHPフレームワークLaravelLaravelで最も遅いクエリを見つける方法の詳細な説明

Laravelで最も遅いクエリを見つける方法の詳細な説明

#あなたのウェブサイトは遅いですか?ロードに時間がかかりますか?ユーザーは、ほとんど

使い物にならない と不満を抱いていますか?データベースのクエリを確認する必要があります。すべてのデータベース クエリを簡単に分析する優れた方法を紹介します。

もちろん、Web サイトが遅い理由はたくさんありますが、最も一般的な理由の 1 つはデータベース クエリの遅さです。

しかし、laravelでは、(ほとんどの場合)データベースからデータを取得するためにSQLを使用せず、

Eloquent ORMクエリビルダーを使用します。このため、サイトの速度が大幅に遅くなる原因となっているクエリを特定することが困難になる場合があります。 [関連する推奨事項: laravel ビデオチュートリアル]

DB::listen()

幸いなことに、laravel では、次のような A コールバックを定義できます。クエリが実行されるたびに呼び出されます (

ここを参照)。これを行うには、次のコードを任意のサービス プロバイダー (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/ による呼び出しを除外できることを意味します。 <pre class='brush:php;toolbar:false;'>DB::listen(function ($query) { $stackTrace = collect(debug_backtrace())-&gt;filter(function ($trace) { return !str_contains($trace[&amp;#39;file&amp;#39;], &amp;#39;vendor/&amp;#39;); }); dd($stackTrace); });</pre>ここでは、 を使用するために配列を Collection に変換します。 filter メソッドで、

file

現在 $tracevendor/ がある場合、それをコレクションから削除します。 上記のコードを実行すると、次のような内容が表示されます: <pre class='brush:php;toolbar:false;'>Illuminate\Support\Collection {#1237 ▼ #items: array:5 [▼ 12 =&gt; array:7 [▼ &quot;file&quot; =&gt; &quot;/home/cosme/Documents/projects/cosme.dev/app/Models/Post.php&quot; &quot;line&quot; =&gt; 61 &quot;function&quot; =&gt; &quot;get&quot; &quot;class&quot; =&gt; &quot;Illuminate\Database\Eloquent\Builder&quot; &quot;object&quot; =&gt; Illuminate\Database\Eloquent\Builder {#310 ▶} &quot;type&quot; =&gt; &quot;-&gt;&quot; &quot;args&quot; =&gt; [] ] 16 =&gt; array:6 [▶] 17 =&gt; array:6 [▶] 61 =&gt; array:7 [▶] 62 =&gt; array:4 [▶] ] #escapeWhenCastingToString: false }</pre>項目は大幅に減り、63 個からわずか 5 個になりました。最も重要な点は、コレクション内の最初の項目が、SQL クエリをトリガーする正確な場所であることです。これは、この情報を抽出して最も遅いクエリを見つけることができることを意味します。

ログへの出力

必要な情報がすべて揃ったので、ログに記録して、検査して最も遅いクエリを見つけられるようにしてみませんか? :
public function boot()
{
    DB::listen(function ($query) {
        $location = collect(debug_backtrace())->filter(function ($trace) {
            return !str_contains($trace[&#39;file&#39;], &#39;vendor/&#39;);
        })->first(); // grab the first element of non vendor/ calls

        $bindings = implode(", ", $query->bindings); // format the bindings as string

        Log::info("
            ------------
            Sql: $query->sql
            Bindings: $bindings
            Time: $query->time
            File: ${location[&#39;file&#39;]}
            Line: ${location[&#39;line&#39;]}
            ------------
        ");
    });
}
これをアプリケーションで使用している場合は、ログ ファイルを確認すると、次のようなクエリ情報が表示されるはずです。

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

これで、どのクエリが最も遅いかがわかり、処理を開始できます。それらを 1 つずつ高速化するか、少なくともキャッシュするようにしてください。

拡張デバッグ

これはデバッグに便利ですが、この手法はさまざまな方法で使用できます。

その週の最も遅いクエリを示す週次レポートを作成できます。

クエリが時間しきい値を超えると、スラック アラートを受け取る場合があります。

あなたとあなたのチームが毎回表示できるダッシュボードを作成できます。クエリが実行されました

#空には限界がありません。

元のアドレス: https://dev.to/cosmeoes/how-to-find-the-slowest-query-in-your-application-4igb

翻訳アドレス: https://learnku.com/laravel/t/65164

プログラミング関連の知識については、

プログラミング ビデオ

をご覧ください。 !

以上がLaravelで最も遅いクエリを見つける方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はlearnkuで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Laravelの使用:PHPでWeb開発を合理化しますLaravelの使用:PHPでWeb開発を合理化しますApr 19, 2025 am 12:18 AM

Laravelは、次のようなWeb開発プロセスを最適化します。1。ルーティングシステムを使用してURL構造を管理します。 2。ブレードテンプレートエンジンを使用して、ビュー開発を簡素化します。 3.キューを介して時間のかかるタスクを処理します。 4. Eloquentormを使用して、データベース操作を簡素化します。 5.ベストプラクティスに従って、コードの品質と保守性を向上させます。

Laravel:PHP Webフレームワークの紹介Laravel:PHP Webフレームワークの紹介Apr 19, 2025 am 12:15 AM

Laravelは、強力なツールセットを提供し、開発プロセスを簡素化し、コードの保守性とスケーラビリティを向上させる最新のPHPフレームワークです。 1)Eloquentormはデータベース操作を簡素化します。 2)ブレードテンプレートエンジンは、フロントエンド開発を直感的にします。 3)職人のコマンドラインツールは、開発効率を向上させます。 4)パフォーマンスの最適化には、MVCアーキテクチャ、キューの処理、および書き込みテストケースの使用、キャッシュメカニズムの使用、キャッシュメカニズムの使用が含まれます。

Laravel:MVCアーキテクチャとベストプラクティスLaravel:MVCアーキテクチャとベストプラクティスApr 19, 2025 am 12:13 AM

LaravelのMVCアーキテクチャは、データロジック、プレゼンテーション、ビジネス処理の分離のためのモデル、ビュー、およびコントローラーを介して、コードの構造と保守性を向上させます。 1)モデルはデータを処理します。2)ビューは表示の責任があります。3)コントローラーはユーザー入力とビジネスロジックを処理します。このアーキテクチャにより、開発者はビジネスロジックに集中し、コードの泥沼に陥ることを避けることができます。

Laravel:主な機能と利点が説明されていますLaravel:主な機能と利点が説明されていますApr 19, 2025 am 12:12 AM

Laravelは、MVCアーキテクチャに基づいたPHPフレームワークで、簡潔な構文、強力なコマンドラインツール、便利なデータ操作、柔軟なテンプレートエンジンを備えています。 1.エレガントな構文と使いやすいAPIにより、開発が迅速かつ使いやすくなります。 2。職人コマンドラインツールは、コード生成とデータベース管理を簡素化します。 3.Eloquentormは、データ操作を直感的かつシンプルにします。 4.ブレードテンプレートエンジンは、高度なビューロジックをサポートしています。

Laravelを使用したバックエンドの構築:ガイドLaravelを使用したバックエンドの構築:ガイドApr 19, 2025 am 12:02 AM

Laravelは、エレガントな構文、豊富な機能、強力なコミュニティサポートを提供するため、バックエンドサービスの構築に適しています。 1)LaravelはMVCアーキテクチャに基づいており、開発プロセスを簡素化します。 2)Eloquentormが含まれ、データベース操作を最適化します。 3)Laravel's Ecosystemは、開発効率を向上させるために、職人、ブレード、ルーティングシステムなどのツールを提供します。

Laravelフレームワークのスキル共有Laravelフレームワークのスキル共有Apr 18, 2025 pm 01:12 PM

継続的な技術の進歩のこの時代において、現代のプログラマーにとって高度なフレームワークをマスターすることが重要です。この記事では、Laravelフレームワークであまり知られていないテクニックを共有することで、開発スキルを向上させるのに役立ちます。エレガントな構文と幅広い機能で知られるこの記事では、その強力な機能を掘り下げ、効率的で保守可能なWebアプリケーションを作成するための実用的なヒントとコツを提供します。

LaravelとThinkPhpの違いLaravelとThinkPhpの違いApr 18, 2025 pm 01:09 PM

LaravelとThinkPhpはどちらも人気のあるPHPフレームワークであり、開発における独自の利点と短所を持っています。この記事では、2つの深さを比較し、アーキテクチャ、機能、パフォーマンスの違いを強調して、開発者が特定のプロジェクトのニーズに基づいて情報に基づいた選択を行うのに役立ちます。

Laravelユーザーログイン機能リストLaravelユーザーログイン機能リストApr 18, 2025 pm 01:06 PM

Laravelのユーザーログイン機能の構築は重要なタスクであり、この記事では、ユーザー登録からログイン検証までのすべての重要なステップをカバーする包括的な概要を提供します。 Laravelの組み込み検証機能の力に飛び込み、特定のニーズに合わせてログインプロセスをカスタマイズして拡張することをガイドします。これらのステップバイステップの手順に従うことにより、Laravelアプリケーションのユーザーにシームレスなアクセスエクスペリエンスを提供する安全で信頼性の高いログインシステムを作成できます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境