【发布时间】: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