欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Laravel中如何找到最慢的查詢

這篇“Laravel中如何找到最慢的查詢”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Laravel中如何找到最慢的查詢”文章吧。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了合浦免費建站歡迎大家使用!

DB::listen()

幸運的是,在 laravel 中,我們可以定義一個在每次執(zhí)行查詢時調(diào)用的回調(diào)(參見 此處)。為此,請將以下代碼添加到任何服務(wù)提供者(例如 AppServiceProvider):

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

如您所見,我們接收了一個變量 $query,這個變量是 QueryExecuted 類的一個實例。這意味著我們可以訪問有關(guān)已執(zhí)行查詢的一些信息:

 DB::listen(function ($query) {
     $query->sql; // 執(zhí)行的 sql 字符串
     $query->bindings; // 傳遞給sql查詢的參數(shù)(這將替換sql字符串中的 "?")
     $query->time; // 執(zhí)行查詢所用的時間;
 });

這是非常有用的信息,現(xiàn)在我們可以通過查看 $query->time 屬性來識別慢查詢。 但這并沒有告訴我們在我們的代碼中查詢執(zhí)行的位置。

我怎么知道查詢是在哪里執(zhí)行的?

即使該 $query 變量沒有給我們?nèi)魏侮P(guān)于其來源的信息, 我們?nèi)匀豢梢允褂?PHP 內(nèi)置函數(shù)  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 [?]
  ]
  ....

這是一個數(shù)組,其中包含請求中到目前為止的每個函數(shù)調(diào)用。我將只關(guān)注每個數(shù)組中的 fileline 鍵。

如果你仔細看,你會發(fā)現(xiàn)在我的例子中有 63 個函數(shù)調(diào)用,這是一個簡單的應(yīng)用程序,如果在更復(fù)雜的應(yīng)用程序中,可能會更多。更糟糕的是,如果您查看頂部的那些, 它們都是 laravel 框架的內(nèi)部函數(shù)。我們是否應(yīng)該逐一查看,直到找到可能對我們有幫助的東西?

查找查詢位置

正如我之前所說,它們中的大多數(shù)是內(nèi)部框架調(diào)用,這意味著這些文件中的大多數(shù)都在我們的 vendor/ 目錄中。這意味著我們可以檢查每個 file 并過濾掉任何具有 vendor/ 的調(diào)用,如下所示:

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

    dd($stackTrace);
});

在這里,我將數(shù)組轉(zhuǎn)換為集合以使用該 filter 方法,如果 file 當前 $tracevendor/ 我們將其從集合中刪除。

如果您運行上面的代碼,您將看到如下內(nèi)容:

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 個。最好的部分是集合中的第一項是我們觸發(fā) 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']}
            ------------
        ");
    });
}

如果您在應(yīng)用程序中使用它,您可以檢查您的日志文件,您應(yīng)該會看到如下查詢信息:

[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
----------

以上就是關(guān)于“Laravel中如何找到最慢的查詢”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁名稱:Laravel中如何找到最慢的查詢
標題鏈接:http://aaarwkj.com/article38/psocsp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、網(wǎng)站收錄響應(yīng)式網(wǎng)站、軟件開發(fā)營銷型網(wǎng)站建設(shè)、App設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
国产精品大屁股一区二区| av在线视频男人的天堂| 国产激情福利一区二区| 国产伦国产一区二区三区在线观看| 午夜性色福利在线播放| 国产乱av一区二区三区| 97日韩在线免费视频网站| 免费国产污网站在线观看| 日本欧美高清一区二区| 欧美成人精品资源在线观看| 亚洲图文一区二区三区四区| 日韩高清不卡免费视频| 日韩精品在线第一视频| 亚洲国产精品久久久精品| 国产黄色大片一级久久| 亚洲风情亚av在线播放| 亚洲精品中文字幕乱码三区91| 国产男女猛烈无遮挡av| 成人深夜福利视频在线| 尤物视频在线观看一下| 欧美日韩国产一区二区的| 亚洲成av人片一区二久久精品| 久久亚洲精品中文字幕一| 中国的性生活黄片免费观看| 情侣自拍偷拍亚洲天堂区| 久久精品免成人费电影| 人人妻人人澡人人妻| 成熟女人毛茸茸的视频| 蜜桃视频在线中文字幕| 夜夜草视频在线免费观看| 一区二区三区免费视频少妇| 久久香蕉国产线看观看亚洲| 亚洲精品综合在线二区| 99久久热这里只有精品| 日本一区二区不卡视频在线播放| 色香蕉精品国产综合| 久久国产精品午夜亚洲欧美| 久久超碰一区二区三区| 日韩欧美国产麻豆一区精品| 在线观看免费在线观看免费| 91人妻互换一区二区|