【问题标题】:Listen laravel 'illuminate.query' events in artisan console commands在工匠控制台命令中收听 laravel 'illuminate.query' 事件
【发布时间】:2016-10-05 14:13:37
【问题描述】:

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

【问题讨论】:

  • 我不是PHP专家,但经过深思熟虑和谷歌搜索,我认为我上面的问题根本没有意义。我的期望是,当控制台命令运行时,它应该捕获任何请求生成的所有查询事件。但是每个新请求都会在单独的线程上初始化一个新应用程序。控制台命令本身可能在单独的线程中运行。所以我不认为这些独立的线程会在它们之间共享任何数据。将此问题留待 PHP/Laravel 大师发表评论。

标签: php laravel laravel-5 laravel-events


【解决方案1】:

你可以使用这个来收听数据库查询:

DB::listen(function($query) { 

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


});

【讨论】:

  • 我检查了它,它仍然无法正常工作。我认为问题在于,当工匠运行命令时,它可能会产生一个单独的线程。因此,该线程将不会接收来自另一个线程的事件。事实上,如果我谷歌“在工匠控制台上收听事件”,我看不到任何结果,所以我为什么要问我是否在思考正确的方向?如果我从我的系统中监听事件,那么我可以很好地打印所有日志。只有在从控制台命令运行时,才会收到事件。
  • 只需使用 $this->info(...);
【解决方案2】:

对于那些有兴趣的人 监听照亮查询

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

还有更多高级 Lisen Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 2018-02-21
    • 2021-11-16
    • 2014-08-30
    • 2014-09-07
    • 2016-03-15
    • 1970-01-01
    • 2020-12-25
    相关资源
    最近更新 更多