Laravel 5.3 - Как регистрировать все запросы на странице?
Моя команда и я работаем над довольно большим проектом. Там запросы происходят повсюду - в контроллерах, в виду композиторов в представлениях (ленивая загрузка) и, вероятно, в некоторых других сервисах. Это усложняет отслеживание всего этого, и скорость загрузки страницы на данный момент довольно медленная.
Где бы я поместил \DB :: enableQueryLog() и \DB :: getQueryLog(), чтобы регистрировать ВСЕ запросы и выгружать их? В основном я ищу какое-то место в коде, которое происходит до того, как произойдет какой-либо из запросов (поставить enableQueryLog()), и я ищу место, которое происходит после рендеринга представлений (для дампа getQueryLog()).
Что было бы хорошим путем?
Заранее спасибо.
Ответы
Ответ 1
Вот прекрасный пример:
https://laravel.com/docs/5.3/database#listening-for-query-events
Откройте приложение\Providers\AppServiceProvider.php и добавьте следующую функцию Boot()
:
DB::listen(function ($query) {
var_dump([
$query->sql,
$query->bindings,
$query->time
]);
});
Ответ 2
Вы можете добавить это в файл Providers/AppServiceProvider.php и проверить их в файле журнала 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));
}
});
}
}
Ответ 3
Если вы хотите напечатать запрос, который выполняется в вашем приложении, выполните следующие действия.
Шаг 1. Перейдите в файл AppServiceProvider.php.//Путь к файлу App\Providers\AppServiceProvider.php
Шаг 2: создайте метод boot() и вставьте приведенный ниже код.
public function boot() {
// Log queries
if (true) {
\DB::listen(function ($query) {
\Log::info(
$query->sql, $query->bindings, $query->time
);
});
}
}
Шаг 3. Теперь вы можете видеть свои запросы в файле lumen.log или laravel.log. Путь к файлу: laravel_app\storage\logs\laravel.log или lumen.log.
Наслаждаться....
Ответ 4
Поместите этот код прямо над кодом, где выполняется ваш запрос
\DB::listen(function($sql) {
die(\Illuminate\Support\Str::replaceArray('?', $sql->bindings, $sql->sql));
});
Только что изменено для исполняемого запроса:
\DB::listen(function ($query) {
// Enclose in single quotes for string params.
$bindings = collect($query->bindings)->map(function ($param) {
if(is_numeric($param)) {
return $param;
} else {
return "'$param'";
}
});
\Log::info(\Illuminate\Support\Str::replaceArray('?', $bindings->toArray(), $query->sql));
});
Ответ 5
добавьте промежуточное программное обеспечение, которое выполняется после выполнения запроса и регистрирует ваши запросы... см. Terminable Middlwares
Ответ 6
Вы используете MySQL? Вы можете просто закрыть журнал.
Как показать последние запросы, выполняемые в MySQL?
Или использовать Laurvel Debug Bar?
Ответ 7
Также доступен пакет:
срубы мои-запросы
https://packagist.org/packages/technoknol/log-my-queries
Просто установите и добавьте запись в промежуточное ПО. Все запросы будут записываться в файл журнала по умолчанию laravel.log
.