我和我的团队正在开展一个相当大的项目。随处可见的查询 - 在控制器中,在视图中的视图作曲家(延迟加载)以及可能在其他一些服务中。现在越来越难以跟踪这一切,目前页面加载速度相当慢。
我将把\ DB :: enableQueryLog()和\ DB :: getQueryLog()放在哪里记录所有查询并转储它们?基本上我正在寻找在任何查询发生之前发生的代码中的某个位置(放置enableQueryLog())并且我正在寻找在视图呈现之后发生的位置(转储getQueryLog())。
有什么好办法可以解决这个问题?
提前致谢。
答案 0 :(得分:28)
以下是一个完美的例子:
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
]);
});
答案 1 :(得分:8)
您可以将它添加到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));
}
});
}
}
答案 2 :(得分:1)
如果要打印在应用程序上执行的查询,请执行以下步骤。
步骤1 :转到您的AppServiceProvider.php文件。 //文件路径App \ Providers \ AppServiceProvider.php
Step2 :制作boot()方法并粘贴以下代码。
public function boot() {
// Log queries
if (true) {
\DB::listen(function ($query) {
\Log::info(
$query->sql, $query->bindings, $query->time
);
});
}
}
Step3 :现在,您可以在lumen.log或laravel.log文件中看到查询。文件路径为laravel_app \ storage \ logs \ laravel.log或lumen.log。
享受。...
答案 3 :(得分:1)
将此代码放在执行查询的代码上方
\DB::listen(function($sql) {
die(\Illuminate\Support\Str::replaceArray('?', $sql->bindings, $sql->sql));
});
答案 4 :(得分:0)
添加在请求完成后执行的中间件并记录您的查询...请参阅Terminable Middlwares
答案 5 :(得分:0)
答案 6 :(得分:0)
Additioanlly也提供软件包:
https://packagist.org/packages/technoknol/log-my-queries
只需安装并将其条目添加到中间件。它将所有查询记录在laravel.log
默认日志文件中。