cari
Rumahrangka kerja phpLaravelPenjelasan terperinci tentang cara mencari pertanyaan paling perlahan dalam Laravel

Penjelasan terperinci tentang cara mencari pertanyaan paling perlahan dalam Laravel

Adakah tapak web anda lambat? Adakah ia mengambil masa yang lama untuk memuatkan? Adakah pengguna mengadu bahawa ia hampir tidak boleh digunakan? Anda harus menyemak pertanyaan pangkalan data anda. Saya akan menunjukkan kepada anda cara yang kemas untuk menganalisis semua pertanyaan pangkalan data anda dengan mudah.

Sudah tentu, terdapat banyak sebab mengapa tapak web anda mungkin lambat, tetapi salah satu sebab yang paling biasa ialah pertanyaan pangkalan data yang perlahan.

Tetapi dalam laravel kami (kebanyakan masa) tidak menggunakan SQL untuk mendapatkan data daripada pangkalan data, kami menggunakan Eloquent ORM dan Query Builder yang kadang-kadang Ini menjadikan sukar untuk menentukan pertanyaan yang menyebabkan tapak kami menjadi begitu perlahan. [Cadangan berkaitan: tutorial video laravel]

DB::listen()

Nasib baik, dalam laravel, kita boleh mentakrifkan panggilan balik A yang dipanggil setiap kali pertanyaan dilaksanakan (lihat di sini). Untuk melakukan ini, tambahkan kod berikut pada mana-mana pembekal perkhidmatan (cth. AppServiceProvider):

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

Seperti yang anda lihat, kami menerima pembolehubah $query iaitu QueryExecuted Satu contoh daripada kelas. Ini bermakna kami mempunyai akses kepada beberapa maklumat tentang pertanyaan yang dilaksanakan:

 DB::listen(function ($query) {
     $query->sql; // 执行的 sql 字符串
     $query->bindings; // 传递给sql查询的参数(这将替换sql字符串中的 "?")
     $query->time; // 执行查询所用的时间;
 });

Ini adalah maklumat yang sangat berguna, kini kami boleh mengenal pasti pertanyaan perlahan dengan melihat atribut $query->time. Tetapi ini tidak memberitahu kami di mana dalam kod kami pertanyaan dilaksanakan.

Bagaimanakah saya tahu di mana pertanyaan itu dilaksanakan?

Walaupun pembolehubah $query tidak memberi kami sebarang maklumat tentang asalnya, kami masih boleh mendapatkan maklumat tersebut menggunakan fungsi terbina dalam PHP debug_backtrace() .

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

Jika anda menjalankan ini pada projek anda, anda akan melihat sesuatu seperti ini pada penyemak imbas anda:

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

Ini ialah tatasusunan dengan nilai dalam permintaan setiap panggilan fungsi setakat ini. Saya hanya akan menumpukan pada kekunci file dan line dalam setiap tatasusunan.

Jika anda melihat dengan teliti anda akan melihat bahawa dalam kes saya terdapat 63 panggilan fungsi, ini adalah aplikasi yang mudah, jika dalam aplikasi yang lebih kompleks ia boleh menjadi lebih. Lebih teruk, jika anda melihat yang di atas, semuanya adalah fungsi dalaman rangka kerja laravel. Patutkah kita melihat setiap satu sehingga kita menemui sesuatu yang boleh membantu kita?

Cari lokasi pertanyaan

Seperti yang saya katakan sebelum ini, kebanyakannya adalah panggilan rangka kerja dalaman, yang bermaksud kebanyakan fail ini berada dalam direktori vendor/ kami. Ini bermakna kita boleh menyemak setiap file dan menapis sebarang panggilan dengan vendor/ seperti ini:

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

    dd($stackTrace);
});

Di sini saya menukar tatasusunan kepada koleksi untuk menggunakan Kaedah filter itu, jika file pada masa ini $trace mempunyai vendor/ kami mengeluarkannya daripada set.

Jika anda menjalankan kod di atas, anda akan melihat sesuatu seperti ini:

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
}

Item adalah jauh lebih sedikit, kami bertukar daripada 63 kepada 5 sahaja. Bahagian yang terbaik ialah item pertama dalam koleksi ialah lokasi tepat di mana kami mencetuskan pertanyaan SQL. Ini bermakna kita boleh mengekstrak maklumat ini untuk mencari pertanyaan yang paling perlahan.

Cetak untuk log

Sekarang kami mempunyai semua maklumat yang kami perlukan, mengapa tidak logkannya supaya kami boleh memeriksa dan mencari pertanyaan yang paling lambat? :

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']}
            ------------
        ");
    });
}

Jika anda menggunakan ini dalam aplikasi anda, anda boleh menyemak fail log anda dan anda sepatutnya melihat maklumat pertanyaan seperti ini:

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

Sekarang anda tahu pertanyaan mana yang paling lambat dan mula memprosesnya satu demi satu, cuba menjadikannya lebih pantas, atau sekurang-kurangnya cachenya.

Penyahpepijat Lanjutan

Ini berguna untuk nyahpepijat, tetapi teknik ini boleh digunakan dalam pelbagai cara.

Anda boleh membuat laporan mingguan yang menunjukkan pertanyaan paling perlahan dalam seminggu.

Anda mungkin menerima makluman kendur jika pertanyaan melebihi ambang masa

Anda boleh mencipta papan pemuka yang anda dan pasukan anda boleh Lihat setiap pertanyaan dilaksanakan di dalamnya

Langit adalah hadnya.

Alamat asal: https://dev.to/cosmeoes/how-to-find-the-slowest-query-in-your-application-4igb

Alamat terjemahan: https://learnku.com/laravel/t/65164

Untuk lebih banyak pengetahuan berkaitan pengaturcaraan, sila lawati: Video Pengaturcaraan! !

Atas ialah kandungan terperinci Penjelasan terperinci tentang cara mencari pertanyaan paling perlahan dalam Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:learnku. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Laravel (PHP) vs Python: Menimbang kebaikan dan keburukanLaravel (PHP) vs Python: Menimbang kebaikan dan keburukanApr 17, 2025 am 12:18 AM

Laravel sesuai untuk membina aplikasi web dengan cepat, sementara Python sesuai untuk pelbagai senario aplikasi yang lebih luas. 1. Laravel Menyediakan Eloquentorm, Enjin Template Blade dan Alat Artisan Untuk Memudahkan Pembangunan Web. 2. Python terkenal dengan jenis dinamiknya, perpustakaan standard yang kaya dan ekosistem pihak ketiga, dan sesuai untuk pembangunan web, sains data dan bidang lain.

Laravel vs Python: Membandingkan kerangka dan perpustakaanLaravel vs Python: Membandingkan kerangka dan perpustakaanApr 17, 2025 am 12:16 AM

Laravel dan Python masing-masing mempunyai kelebihan mereka sendiri: Laravel sesuai untuk membina aplikasi web yang kaya dengan ciri-ciri, dan Python berfungsi dengan baik dalam bidang sains data dan pengaturcaraan umum. 1. Laravel menyediakan enjin template eloquentorm dan bilah, sesuai untuk membina aplikasi web moden. 2. Python mempunyai perpustakaan standard yang kaya dan perpustakaan pihak ketiga, dan rangka kerja Django dan Flask memenuhi keperluan pembangunan yang berbeza.

Tujuan Laravel: Membina aplikasi web yang mantap dan eleganTujuan Laravel: Membina aplikasi web yang mantap dan eleganApr 17, 2025 am 12:13 AM

Laravel bernilai memilih kerana ia boleh menjadikan struktur kod jelas dan proses pembangunan lebih artistik. 1) Laravel didasarkan pada PHP, mengikuti seni bina MVC, dan memudahkan pembangunan web. 2) Fungsi terasnya seperti eloquentorm, alat artisan dan templat bilah meningkatkan keanggunan dan kekukuhan pembangunan. 3) Melalui penghalaan, pengawal, model dan pandangan, pemaju dapat membina aplikasi dengan cekap. 4) Fungsi lanjutan seperti giliran dan pemantauan acara meningkatkan prestasi aplikasi.

Laravel: Terutama rangka kerja backend dijelaskanLaravel: Terutama rangka kerja backend dijelaskanApr 17, 2025 am 12:02 AM

Laravel bukan sahaja rangka kerja back-end, tetapi juga penyelesaian pembangunan web yang lengkap. Ia menyediakan fungsi back-end yang kuat, seperti penghalaan, operasi pangkalan data, pengesahan pengguna, dan lain-lain, dan menyokong pembangunan front-end, meningkatkan kecekapan pembangunan keseluruhan aplikasi web.

Laravel (PHP) vs Python: Memahami Perbezaan UtamaLaravel (PHP) vs Python: Memahami Perbezaan UtamaApr 17, 2025 am 12:01 AM

Laravel sesuai untuk pembangunan web, Python sesuai untuk sains data dan prototaip pesat. 1.Laravel didasarkan pada PHP dan menyediakan sintaks elegan dan fungsi yang kaya, seperti eloquentorm. 2. Python terkenal dengan kesederhanaannya, digunakan secara meluas dalam pembangunan web dan sains data, dan mempunyai ekosistem perpustakaan yang kaya.

Laravel dalam Tindakan: Aplikasi dan contoh dunia nyataLaravel dalam Tindakan: Aplikasi dan contoh dunia nyataApr 16, 2025 am 12:02 AM

Laravelcanbeeffectivelyedinreal-worldapplicationsforbuildingscalableWebsolutions.1) itsimplifiescrudoperationsinrestfulapisusingeloquentorm.2) laravel'secosystem, termasuktoolslikenova, enhancesdevelopment.3)

Fungsi Utama Laravel: Pembangunan BackendFungsi Utama Laravel: Pembangunan BackendApr 15, 2025 am 12:14 AM

Fungsi teras Laravel dalam pembangunan back-end termasuk sistem penghalaan, eloquentorm, fungsi penghijrahan, sistem cache dan sistem giliran. 1. Sistem penghalaan memudahkan pemetaan URL dan meningkatkan organisasi dan penyelenggaraan kod. 2.eloquentorm menyediakan operasi data berorientasikan objek untuk meningkatkan kecekapan pembangunan. 3. Fungsi penghijrahan menguruskan struktur pangkalan data melalui kawalan versi untuk memastikan konsistensi. 4. Sistem cache mengurangkan pertanyaan pangkalan data dan meningkatkan kelajuan tindak balas. 5. Sistem giliran berkesan memproses data berskala besar, elakkan menghalang permintaan pengguna, dan meningkatkan prestasi keseluruhan.

Keupayaan backend Laravel: pangkalan data, logik, dan banyak lagiKeupayaan backend Laravel: pangkalan data, logik, dan banyak lagiApr 14, 2025 am 12:04 AM

Laravel melakukan dengan kuat dalam pembangunan back-end, memudahkan operasi pangkalan data melalui eloquentorm, pengawal dan kelas perkhidmatan mengendalikan logik perniagaan, dan menyediakan barisan, acara dan fungsi lain. 1) Jadual pangkalan data Peta Eloquentorm melalui model untuk memudahkan pertanyaan. 2) Logik perniagaan diproses dalam pengawal dan kelas perkhidmatan untuk meningkatkan modulariti dan penyelenggaraan. 3) Fungsi lain seperti sistem giliran membantu menangani keperluan yang kompleks.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Arahan sembang dan cara menggunakannya
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

SecLists

SecLists

SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini