web-dev-qa-db-fra.com

Laravel 5.3 - Comment enregistrer toutes les requêtes sur une page?

Mon équipe et moi travaillons sur un assez gros projet. Il y a des requêtes partout - dans les contrôleurs, dans les compositeurs dans les vues (chargement paresseux) et probablement aussi dans certains autres services. Il devient difficile de garder une trace de tout cela et la vitesse de chargement des pages est assez lente pour le moment. 

Où placerais-je\DB :: enableQueryLog () et\DB :: getQueryLog () pour consigner TOUTES les requêtes et les vider? Fondamentalement, je recherche un emplacement dans le code qui se produit avant l'une des requêtes (pour mettre enableQueryLog ()) et un emplacement qui se produit après le rendu des vues (pour vider getQueryLog ()).

Quel serait un bon moyen de s'y prendre?

Merci d'avance.

14
devk

Voici l'exemple parfait:

https://laravel.com/docs/5.3/database#listening-for-query-events

Ouvrez app\Providers\AppServiceProvider.php et ajoutez les éléments suivants à la fonction Boot()

DB::listen(function ($query) {
    var_dump([
        $query->sql,
        $query->bindings,
        $query->time
    ]);
});
24
Hudson Pereira

Vous pouvez ajouter ceci au fichier Providers/AppServiceProvider.php et les vérifier dans le fichier journal laravel avec tail:

tail -f storage/logs/laravel.log

Vous pouvez même filtrer avec les requêtes que vous souhaitez enregistrer. Par exemple, ici, j’utilisais Laravel Passport et je ne voulais pas enregistrer toutes les requêtes oauth.

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Log;

public function register() {
    if (App::environment('local') && env('APP_URL') == 'http://localhost') {
        Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
            // filter oauth ones
            if (!str_contains($query->sql, 'oauth')) {
                Log::debug($query->sql . ' - ' . serialize($query->bindings));
            }
        });
    }
}
8
buzkall

Placez ce code juste au-dessus du code où votre requête est exécutée 

\DB::listen(function($sql) {
  die(\Illuminate\Support\Str::replaceArray('?', $sql->bindings, $sql->sql));
});
1
Elco

Si vous souhaitez imprimer une requête qui est exécutée sur votre application, procédez comme suit.

Step1 : Accédez à votre fichier AppServiceProvider.php. // chemin du fichier App\Providers\AppServiceProvider.php

Étape 2 : Créez la méthode boot () et collez le code ci-dessous.

public function boot() {
        // Log queries
        if (true) {
            \DB::listen(function ($query) {
                \Log::info(
                    $query->sql, $query->bindings, $query->time
                );
            });
        }
    }

Étape 3 : Vous pouvez maintenant voir vos requêtes dans le fichier Lumen.log ou laravel.log Le chemin du fichier est laravel_app\storage\logs\laravel.log ou Lumen.log.

Prendre plaisir....

0
Umang Soni

Additioanlly Il y a un paquet disponible aussi: 

log-my-requêtes

https://packagist.org/packages/technoknol/log-my-queries

Il suffit d'installer et d'ajouter son entrée au middleware. Il enregistrera toutes les requêtes dans le fichier journal laravel.log par défaut. 

0
shyammakwana.me

ajoutez un middleware qui s'exécute une fois la requête terminée et enregistre vos requêtes ... voir Terminable Middlwares

0
Sherif

Utilisez-vous MySQL? Vous pouvez simplement suivre le journal.

Comment afficher les dernières requêtes exécutées sur MySQL?

Ou utilisez la barre de débogage Laravel?

0
Mick