Слушайте события laravel 'illuminate.query' в консольных командах ремесленника

Я хотел бы регистрировать запросы laravel. Я знаю, что мы можем слушать запросы laravel, используя следующий код:

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

Я хотел бы поместить приведенный выше код в команду ремесленника, чтобы я прослушивал запросы только тогда, когда эта программа запущена, а не все время. Я написал следующий код.

<?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;
            }
        }
    }
}

Я ожидал, что как только я запущу эту команду с помощью artisan, метод logDatabaseQueries() начнет отслеживать события. Однако это не работает, потому что я никогда не получаю никаких событий запроса. Я думаю в правильном направлении?


person Rash    schedule 06.06.2016    source источник
comment
Я не эксперт по PHP, но после долгих размышлений и поиска в Google я думаю, что мой вопрос выше вообще не имеет смысла. Я ожидал, что при запуске консольной команды она должна перехватывать все события запроса, сгенерированные любым запросом. Но каждый новый запрос будет инициализировать новое приложение в отдельном потоке. Консольная команда, вероятно, выполняется в отдельном потоке. Поэтому я не думаю, что эти независимые потоки будут обмениваться данными между собой. Оставьте этот вопрос открытым для комментариев гуру PHP/Laravel.   -  person Rash    schedule 07.06.2016


Ответы (2)


Вы можете прослушать запрос БД, используя это:

DB::listen(function($query) { 

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


});
person geckob    schedule 06.06.2016
comment
Я проверил, все равно не работает. Я думаю, проблема в том, что когда ремесленник запускает команду, она может порождать отдельный поток. Таким образом, этот поток не будет получать события из другого потока. На самом деле, если я прослушиваю события в Google на консоли artisan, я не вижу никаких результатов, поэтому я спрашиваю, думаю ли я в правильном направлении или нет? Если я прослушиваю события из своей системы, я могу нормально распечатать все журналы. Только при запуске из консольной команды события не принимаются. - person Rash; 06.06.2016
comment
Просто используйте $this-›info(...); - person Lachezar Todorov; 17.08.2020

Для тех, кому интересно Слушайте запросы на освещение

// routes web.php
      \Event::listen('illuminate.query', function($sql) {
        var_dump($sql);
        \Log::info($sql);
    });

А для получения дополнительной и расширенной лицензии здесь

person Zymawy    schedule 07.04.2018