Медленные запросы — это не баг, а результат того, что кто-то (скорее всего ты) писал код быстро. Laravel всё стерпит, пока не придёт реальный трафик. Потом начинается цирк: CPU горит, база воет, пользователи матерятся, менеджер плачет. Нужно не молиться, а смотреть, какие именно запросы убивают приложение.
Каждый второй Laravel-проект дохнет не потому, что фреймворк «тяжёлый», а потому что кто-то нафигачил ->with('relation')->with('another')->with('andAnother') и теперь база крутит такие JOIN’ы, что Oracle в 90-х бы позавидовал.
Чтобы понять, кто виноват, надо вытащить медленные запросы на свет. И нет, гадание по логам «почему оно тормозит» не работает. Используй инструменты, которые реально показывают, какие запросы жрут время.
Debugbar: быстрый рентген твоего кода
barryvdh/laravel-debugbar — штука для тех, кто хочет быстро увидеть, где именно ты нагадил.
Установил:
composer require barryvdh/laravel-debugbar --dev
и в дев-режиме у тебя снизу экрана висит панелька. Там видно каждый запрос, время выполнения и сколько раз ты дернул одну и ту же таблицу.
Удобно для локалки. На прод лучше не ставь, иначе твой сервер умрёт раньше тебя.
Telescope: микроскоп для всего приложения
Telescope — это не только про SQL, он ещё показывает запросы, очереди, события и прочую внутреннюю кухню. Подключается в пару команд:
composer require laravel/telescope
php artisan telescope:install
php artisan migrate
и смотришь /telescope.
Если хочешь знать, почему твой код работает как пьяный тракторист - Telescope покажет правду. Только помни: это тоже инструмент для дев-окружения, на прод тащить опасно.
Horizon: если у тебя очередь не двигается
Если запросы у тебя в очередях, а воркеры сжирают больше памяти, чем Chrome с двадцатью вкладками, ставь Horizon:
composer require laravel/horizon
php artisan horizon:install
Дальше /horizon — и видишь, сколько задач реально жрут время, а какие тупо висят. Не панацея, но хотя бы понятно, кто тормозит.
Query Log: дедовский способ
Когда все красивые тулзы не подходят, можно тупо включить лог запросов:
use Illuminate\Support\Facades\DB;
public function boot()
{
if (config('app.debug')) {
DB::listen(function ($query) {
logger()->debug('SQL: ' . $query->sql, $query->bindings);
});
}
}
Или если хочешь совсем жёстко:
dd(DB::getQueryLog());
— и сразу видишь, чем именно твой код убил базу.
Итог
Медленные запросы — это не «фича Laravel», а проблема.
- Debugbar — быстро чекнуть локалку.
- Telescope — копнуть глубже.
- Horizon — если очереди живут своей жизнью.
- Query Log — прямое вскрытие без анестезии.
Не надо гадать, «почему тормозит». Нужно открыть инструменты и увидеть: да, тут у тебя SELECT в 20 JOIN’ов, да ещё и без индексов. Всё остальное — самообман.
0 комментариев