搜尋
首頁php框架Laravel淺析Laravel 中怎麼找到最慢的查詢

你的網站慢嗎?加載需要很長時間嗎?用戶是否抱怨它幾乎 無法使用 ?您應該檢查您的資料庫查詢。我將向您展示一種輕鬆分析所有資料庫查詢的簡潔方法。

淺析Laravel 中怎麼找到最慢的查詢

當然,您的網站速度慢的原因有很多,但最常見的原因之一是資料庫查詢速度慢。

但是在laravel 中,我們(大多數時候)不使用SQL 從資料庫中取得數據,我們使用Eloquent ORM查詢建構器 ,這有時會導致很難找出造成我們網站如此緩慢的查詢。

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 [▶]
  ]
  ....

這是一個數組,其中包含請求中到目前為止的每個函數呼叫。我將只關注每個數組中的 fileline 鍵。

如果你仔細看,你會發現在我的例子中有 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 目前$tracevendor/ 我們將其從集合中刪除。

如果您執行上面的程式碼,您將看到如下內容:

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->sql
            Bindings: $bindings
            Time: $query->time
            File: ${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: 1
Time: 0.18
File: /home/cosme/Documents/projects/cosme.dev/app/Models/Post.php
Line: 61
----------

現在您知道哪些查詢是最慢的,並開始一一處理它們,嘗試使它們更快,或至少快取它們。

擴展偵錯

這對於偵錯非常有用,但這種技術可以以多種方式使用。

您可以建立顯示一週中最慢查詢的每週報表。

如果查詢超過時間閾值,您可能會收到鬆弛警報

您可以建立一個儀表板,您和您的團隊可以在其中查看執行的每個查詢

天空才是極限。

【相關推薦:laravel影片教學

以上是淺析Laravel 中怎麼找到最慢的查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:learnku。如有侵權,請聯絡admin@php.cn刪除
laravel框架技巧分享laravel框架技巧分享Apr 18, 2025 pm 01:12 PM

在這個技術不斷進步的時代,掌握先進的框架對於現代程序員至關重要。本文將通過分享 Laravel 框架中鮮為人知的技巧,幫助你提升開發技能。 Laravel 以其優雅的語法和廣泛的功能而聞名,本文將深入探討其強大的特性,提供實用技巧和竅門,幫助你打造高效且維護性高的 Web 應用程序。

laravel和thinkphp的區別laravel和thinkphp的區別Apr 18, 2025 pm 01:09 PM

Laravel 和 ThinkPHP 都是流行的 PHP 框架,在開發中各有優缺點。本文將深入比較這兩者,重點介紹它們的架構、特性和性能差異,以幫助開發者根據其特定項目需求做出明智的選擇。

laravel用戶登錄功能一覽laravel用戶登錄功能一覽Apr 18, 2025 pm 01:06 PM

在 Laravel 中構建用戶登錄功能是一個至關重要的任務,本文將提供一個全面的概述,涵蓋從用戶註冊到登錄驗證的每個關鍵步驟。我們將深入探討 Laravel 的內置驗證功能的強大功能,並指導您自定義和擴展登錄過程以滿足特定需求。通過遵循這些一步一步的說明,您可以創建安全可靠的登錄系統,為您的 Laravel 應用程序的用戶提供無縫的訪問體驗。

laravel有哪些版本 laravel新手版本選擇方法laravel有哪些版本 laravel新手版本選擇方法Apr 18, 2025 pm 01:03 PM

在面向初学者的 Laravel 框架版本选择指南中,本文深入探討了 Laravel 的版本差異,旨在協助初學者在眾多版本之間做出明智的選擇。我們將重點介紹每個版本的關鍵特徵、比較它們的優缺點,並提供有用的建議,幫助新手根據他們的技能水準和項目需求挑選最合適的 Laravel 版本。對於初學者來說,選擇一個合適的 Laravel 版本至關重要,因為它可以顯著影響他們的學習曲線和整體開發體驗。

laravel怎麼查看版本號 laravel查看版本號方法laravel怎麼查看版本號 laravel查看版本號方法Apr 18, 2025 pm 01:00 PM

Laravel框架內置了多種方法來方便地查看其版本號,滿足開發者的不同需求。本文將探討這些方法,包括使用Composer命令行工具、訪問.env文件或通過PHP代碼獲取版本信息。這些方法對於維護和管理Laravel應用程序的版本控制至關重要。

php框架laravel使用最新方法php框架laravel使用最新方法Apr 18, 2025 pm 12:57 PM

Laravel 是一個基於 PHP 的流行 Web 應用程序框架,因其優雅的語法和強大的功能而廣受開發人員歡迎。它的最新版本引入了許多改進和新功能,旨在提升開發體驗和應用程序性能。本文將深入探討 Laravel 的最新方法,重點介紹如何利用這些更新來構建更強大、更高效的 Web 應用程序。

laravel框架安裝方法laravel框架安裝方法Apr 18, 2025 pm 12:54 PM

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

Laravel如何學習 怎麼免費學習LaravelLaravel如何學習 怎麼免費學習LaravelApr 18, 2025 pm 12:51 PM

想要學習 Laravel 框架,但苦於沒有資源或經濟壓力?本文為你提供了免費學習 Laravel 的途徑,教你如何利用網絡平台、文檔和社區論壇等資源,從入門到掌握,為你的 PHP 開發之旅奠定堅實基礎。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具