"Сайт на Laravel тормозит: 5 скрытых причин и как их найти"
Laravel — один из самых быстрых и мощных PHP-фреймворков в мире. Но если ваш проект загружается дольше 2–3 секунд, выдает ошибки 502/504 Gateway Timeout при наплыве трафика или перегружает сервер — дело не в фреймворке. Дело в архитектуре.
Каждая лишняя секунда загрузки сайта снижает конверсию на 20%. В этой статье технические специалисты «Команды-А» разбирают 5 самых частых причин, из-за которых тормозят проекты на Laravel, и показывают, как их устранить.
1. Проблема N+1 запроса к базе данных
Это абсолютный лидер среди «убийц» производительности. Проблема N+1 возникает при работе с ORM Eloquent, когда вы получаете список моделей, а затем в цикле обращаетесь к связанным данным.
Например, вы выводите 50 товаров и для каждого запрашиваете его категорию:
$products = Product::all();
foreach ($products as $product) {
echo $product->category->name;
}
Что происходит под капотом
Laravel делает 1 запрос для получения товаров и еще 50 запросов для получения категорий.
Итого: 51 запрос к БД для одной простой страницы.
Как лечить
Использовать «жадную загрузку» (Eager Loading) с помощью метода with():
$products = Product::with('category')->get();
Всего пара символов снижает количество запросов к базе данных с 51 до 2.
Чтобы найти такие утечки, мы обычно используем пакет Laravel Debugbar или Clockwork.
2. Отсутствие индексов в таблицах MySQL/PostgreSQL
Когда база данных разрастается до сотен тысяч записей, простые выборки начинают занимать секунды вместо миллисекунд.
Если в таблице нет индексов, СУБД выполняет Full Table Scan — перебирает каждую строку в поисках нужной.
Как лечить
Регулярно анализировать медленные запросы.
Если вы часто ищете пользователей по email или заказы по status, эти колонки должны быть проиндексированы в миграциях:
$table->index('status');
3. Выполнение тяжелых задач в синхронном режиме
Типичная ошибка начинающих разработчиков: пользователь оформляет заказ, и в этот же момент сервер:
- генерирует PDF-счет;
- обращается к API СДЭК;
- отправляет email.
В итоге клиент смотрит на крутящийся лоадер 10 секунд.
Как лечить
Использовать очереди (Queues).
Все задачи, которые не нужны для немедленного отображения страницы, должны отправляться в фоновый режим.
В Laravel достаточно добавить интерфейс ShouldQueue к классу Job или Event, и настроить worker (например, через Supervisor и Redis).
4. Игнорирование кэширования
База данных — самое узкое горлышко любого веб-приложения.
Нет смысла при каждом обновлении страницы запрашивать из БД:
- список меню;
- контакты в шапке;
- категории товаров.
Как лечить
Использовать кэширование на уровне приложения.
Laravel поддерживает драйверы Redis и Memcached прямо «из коробки».
$categories = Cache::remember('categories_menu', 3600, function () {
return Category::active()->get();
});
Этот код возьмет данные из быстрой оперативной памяти сервера (Redis), и только раз в час обновит их из базы данных.
5. Забытые команды оптимизации на Production
На локальном сервере (при разработке) Laravel загружает множество конфигураций динамически.
Если не отключить это на production-сервере, фреймворк будет тратить ресурсы на чтение сотен файлов при каждом запросе.
Как лечить
Во время деплоя проекта обязательно должны выполняться три команды:
php artisan config:cache
php artisan route:cache
php artisan view:cache
Эти команды собирают все настройки, маршруты и шаблоны в единые оптимизированные файлы, ускоряя инициализацию приложения (Time To First Byte) в 2–3 раза.
Выжимаем максимум из вашего проекта
Найти и исправить проблему в готовом коде сложнее, чем написать его с нуля.
Если ваш сайт на Laravel начал тормозить, падать от нагрузок или вы теряете клиентов из-за медленной работы — мы готовы помочь.
Техлиды «Команды-А» проведут глубокий аудит вашего проекта:
- проанализируют архитектуру;
- найдут «узкие места» в базах данных;
- настроят отказоустойчивую инфраструктуру.