0

我想记录 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()方法将开始侦听事件。但是,这不起作用,因为我从未收到任何查询事件。我在思考正确的方向吗?

4

2 回答 2

4

您可以使用以下命令收听数据库查询:

DB::listen(function($query) { 

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


});
于 2016-06-06T06:10:45.370 回答
0

对于那些有兴趣的人 聆听启发式询问

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

还有更多和高级的 Lisen在这里

于 2018-04-07T12:51:06.553 回答