我想记录laravel查询。我知道我们可以使用以下代码监听laravel查询:
Event::listen('illuminate.query', function ($query, $bindings, $time, $name) {
// Log queries
};
我想将上面的代码放在一个artisan命令中,这样我只能在程序运行时监听查询,而不是所有时间。我写了下面的代码。
<?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()
方法就会开始侦听事件。但是这不起作用,因为我从未收到任何查询事件。我在想正确的方向吗?
答案 0 :(得分:2)
您可以使用以下方式收听数据库查询:
DB::listen(function($query) {
// Log this
\Log::info($query->sql);
});
答案 1 :(得分:0)
对于那些感兴趣的人 听取照亮问题
// routes web.php
\Event::listen('illuminate.query', function($sql) {
var_dump($sql);
\Log::info($sql);
});
For More和Advanced Lisen Here