Laravel 5.3 - 如何记录页面上的所有查询?

2022-08-30 14:08:54

我和我的团队正在从事一个相当大的项目。到处都有查询 - 在控制器中,在视图编辑器中(延迟加载)中,可能在其他一些服务中也是如此。很难跟踪所有内容,并且页面加载速度目前相当慢。

我将把 \DB::enableQueryLog() 和 \DB::getQueryLog() 放在哪里来记录所有查询并转储它们?基本上,我正在寻找在任何查询发生之前发生的代码中的某个位置(将enableQueryLog()放在一起),并且我正在寻找在视图呈现后发生的位置(转储getQueryLog())。

什么是解决这个问题的好方法?

提前致谢。


答案 1

这是一个完美的例子:

https://laravel.com/docs/5.3/database#listening-for-query-events

打开 app\Providers\AppServiceProvider.php并添加以下内容以使其起作用:Boot()

DB::listen(function ($query) {
    var_dump([
        $query->sql,
        $query->bindings,
        $query->time
    ]);
});

答案 2

你可以将其添加到 Providers/AppServiceProvider.php 文件中,并在带有 tail 的 laravel 日志文件中检查它们:

tail -f storage/logs/laravel.log

您甚至可以使用要记录的查询进行筛选。例如,在这里我使用的是Laravel Passport,并且不想记录所有oauth查询。

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Log;

public function register() {
    if (App::environment('local') && env('APP_URL') == 'http://localhost') {
        Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
            // filter oauth ones
            if (!str_contains($query->sql, 'oauth')) {
                Log::debug($query->sql . ' - ' . serialize($query->bindings));
            }
        });
    }
}

推荐