Eloquent ORM rend les interactions de base de données élégantes, mais les requêtes mal optimisées peuvent paralyser les performances de votre application Laravel. Alors que la plupart des développeurs reconnaissent les problèmes de base N + 1, la véritable maîtrise des performances provient du profilage de requête systématique, de la charge stratégique désireuse et des techniques d'optimisation avancées que la plupart des développeurs de Laravel n'explorent jamais. Dans ce guide complet, vous découvrirez des méthodes testées au combat pour transformer des requêtes éloquentes lentes en opérations rapides. Que vous gérez des ensembles de données à million de rangées ou que vous optimis à des pointes de trafic du Black Friday, ces stratégies avancées de profilage et de réglage garantiront que votre couche de base de données fonctionne à son apogée absolue.
Avant de plonger dans l'optimisation, il est crucial de comprendre les mesures clés qui définissent les performances de la requête:
Tueurs de performance de requête communes:
Au-delà de la détection de base, implémentez les approches systématiques pour identifier et éliminer les requêtes N + 1.
Système de détection automatisée:
// app / providers / appServiceProvider.php public function boot () {if ($ this-> app-> isLocal () || $ this-> app-> runninconsole ()) {return; } QueryDetector :: Activer (Threshold: 50, // requêtes par demande rappelle de threshold: function ($ count, $ requêtes) {log :: avertissement ("potentiel n + 1 détecté: {$ count} requêtes", ['url' => request () -> data-url (), 'méthode' => request () -> metheth (), 'samptans_queries' => array_slice ($ requêtes, 0, 5)]); } // app / support / querydetector.php classe queryDetector {public static function activation (int $ threshold, callable $ callback) {db :: écouter (function ($ query) use ($ threshold, $ callback) {static $ count = 0; static $ queries = []; $ count ++; $ queries [] = ['sql' = $ query 'Bindings' => $ Query-> Bindings, 'Time' => $ Query-> Time]; }}Modèles de chargement avancé avancé:
// utilisateur de chargement désireux conditionnel :: avec (['Posts' => function ($ query) {$ query-> where ('publié', true) -> withCount ('commentaires') -> Dermter () -> limite (5);}, 'profil' => function ($ Query) {if (auth () -> check () - {$ query-> with (with // Chargement impatient imbriqué de contraintes Product :: avec (['catégorie' => function ($ query) {$ query-> avec (['parent' => function ($ query) {$ query-> with ('ancêtres');}]);}, 'variantes' => function ($ query) {$ query-> where ('in_stock', true) - '); ]) -> get ();Implémentez le profilage granulaire pour identifier des goulots d'étranglement spécifiques.
Middleware de profilage avancé:
// app / http / middleware / queryprofiler.php public function manche ($ request, fermeture $ suivant) {if (! $ this-> devraitprofile ()) {return $ net ($ request); } $ startTime = MicroTime (true); $ originalHandler = db :: getEventDispatcher (); // Track Détails de l'exécution des requêtes $ requêtes = []; $ TotalTime = 0; Db :: écouter (fonction ($ query) use (& $ redesries, & $ totaltime) {$ requêtes [] = ['sql' => $ query-> sql, 'bindings' => $ query-> bindings, '=> $ query-> time,' connection '=> $ query-> connectionName,' trace '=> $ this-> getCallingTrace (debug_backtrace (debug_backtrace_ignore_args, 10)); $ réponse = $ suivant ($ demande); $ durée = microme (true) - $ starttime; $ this-> recordProfiledata ($ demande, $ réponse, $ requêtes, $ totaltime, $ durée); DB :: SetEventDispatcher ($ originalHandler); retour $ réponse; } Fonction Protégée RecordProfiledata ($ request, $ réponse, $ requêtes, $ totalQueryTime, $ totalDuration) {$ profil = ['url' => $ request-> fullUrl (), 'méthode' => $ request-> méth...
[Courte citation de 8% de l'article original]