2016-06-06 12 views
0

Ich möchte laravel Abfragen protokollieren. Ich weiß, dass wir zu Laravel Abfragen mit dem folgenden Code hören:Listen Laravel 'illuminate.query' Ereignisse in Handwerker Konsole Befehle

Event::listen('illuminate.query', function ($query, $bindings, $time, $name) { 
    // Log queries 
}; 

Ich mag würde in einem Handwerker Befehl obigen Code zu platzieren, so dass ich nur auf Anfragen hören, wenn dieses Programm ausgeführt wird, und nicht die ganze Zeit . Ich habe den folgenden Code geschrieben.

<?php 
// ... namespace and use statements 

class QueryListener extends Command 
{ 
    protected $signature = 'pots:query-listen'; 
    protected $description = 'Runs forever and logs all database queries.'; 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    private function logDatabaseQueries() 
    { 
     Event::listen('illuminate.query', function ($query, $bindings, $time, $name) { 
      Log::info(PHP_EOL.$query.PHP_EOL); 
     }); 
    } 

    public function handle() 
    { 
     $this->logDatabaseQueries(); 

     echo 'Listening for database queries: Type \'stop\' to stop execution.'.PHP_EOL; 
     $stopExecution = false; 

     while ($stopExecution === false) { 
      $handle = fopen('php://stdin', 'r'); 
      $line = fgets($handle); 

      if (strtolower(trim($line)) === 'stop') { 
       fclose($handle); 
       echo 'Aborting script.'.PHP_EOL; 
       $stopExecution = true; 
      } 
     } 
    } 
} 

Meine Erwartung war, dass, sobald ich diesen Befehl ausführen artisan verwenden, die logDatabaseQueries() Methode für Veranstaltungen zu hören beginnt. Dies funktioniert jedoch nicht, da ich nie Abfrageereignisse erhalte. Denke ich in die richtige Richtung?

+0

ich keinen PHP-Experten sind, aber nach reiflicher Überlegung und sucht google, ich glaube, meine Frage oben nicht überhaupt Sinn macht. Meine Erwartung war, dass wenn der Konsolenbefehl ausgeführt wird, er alle Abfrageereignisse abfangen sollte, die von einer Anfrage generiert wurden. Jede neue Anfrage initialisiert jedoch eine neue Anwendung in einem separaten Thread. Der Konsolenbefehl wird wahrscheinlich in einem separaten Thread ausgeführt. Ich denke also nicht, dass diese unabhängigen Threads irgendwelche Daten zwischen ihnen teilen. Lassen Sie diese Frage für PHP/Laravel Gurus offen, um einen Kommentar abzugeben. – Rash

Antwort

1

Sie können DB Abfrage mit anhören:

DB::listen(function($query) { 

    // Log this 
    \Log::info($query->sql); 


}); 
+0

Ich habe es überprüft, es funktioniert immer noch nicht. Ich denke, das Problem ist, dass, wenn Handwerker einen Befehl ausführt, es möglicherweise einen separaten Thread hervorbringt. Daher empfängt dieser Thread keine Ereignisse von einem anderen Thread. In der Tat, wenn ich googlen "auf Veranstaltungen auf Handwerker Konsole zu hören", sehe ich keine Ergebnisse, so dass ich fragen, ob ich in die richtige Richtung denke oder nicht? Wenn ich auf Ereignisse innerhalb meines Systems lausche, kann ich alle Protokolle gut drucken. Nur wenn sie von einem Konsolenbefehl ausgeführt werden, werden die Ereignisse nicht empfangen. – Rash

Verwandte Themen