Laravel позволяет быстро и удобно создавать функциональные приложения. Но именно из-за этой простоты легко допустить ошибки, которые почти незаметно замедляют работу вашего кода, особенно когда приложение начинает обслуживать реальных пользователей с реальными данными.
Хорошая новость: большинство проблем с производительностью происходят по одинаковым причинам, и их можно исправить довольно просто. Ниже приведены самые частые из них и проверенные решения.
1. Проблема N+1-запросов
Суть ошибки: часто разработчик загружает связанные модели внутри цикла, что приводит к огромному числу запросов к базе данных.
Пример:
$posts = Post::all();
foreach ($posts as $post) {
echo $post->author->name;
}При 100 постах Laravel выполнит 101 запрос: один за посты и по одному за каждого автора. Это классическая проблема N+1.
Как исправить: используйте жадную загрузку (eager loading):
$posts = Post::with('author')->get();Laravel выполнит всего два запроса: за посты и за авторов.
Подсказка: инструменты вроде laravel-debugbar или Clockwork помогут вам увидеть, сколько запросов выполняется за один рендер.
2. Загрузка большего объёма данных, чем нужно
Суть ошибки: Model::all() загружает все строки и все колонки таблицы, что избыточно в большинстве случаев.
Как исправить: явно выбирайте только нужные поля и используйте постраничный вывод:
User::select('id', 'name', 'email')->paginate(25);Если вам нужно узнать только наличие записи:
User::where('email', $email)->exists();Laravel предоставляет множество инструментов для выборки именно того, что вам нужно.
3. Отсутствие кэширования
Если на каждом запросе вы пересчитываете тяжёлую статистику или делаете сложные запросы, это быстро перегружает базу данных.
Как исправить: используйте кэш:
$stats = Cache::remember('paid_orders_count', 60, function () {
return Order::where('status', 'paid')->count();
});Даже 60-секундный кэш может значительно снизить нагрузку. Среди того, что проще всего кешировать: статистика на дашбордах, тяжёлые джоины, API-ответы и конфигурационные данные.
4. Тяжёлые операции внутри HTTP-запросов
Когда вы отправляете письма, генерируете PDF или делаете сетевые запросы внутри основного запроса пользователя, сервер ждёт, пока всё завершится и пользователь тоже ждёт.
Как исправить: вынесите это в очереди:
Mail::to($user)->queue(new WelcomeEmail());
SendWelcomeEmail::dispatch($user);Очереди - это одно из самых мощных средств Laravel для повышения производительности.
5. Фильтрация и логика в PHP вместо базы данных
Если вы загружаете все записи в память, а потом фильтруете их в PHP:
$users = User::all();
$active = $users->filter(fn ($u) => $u->is_active);…то вы используете ресурсы PHP вместо гораздо более эффективного SQL-фильтра.
Как исправить: передавайте работу базе:
$active = User::where('is_active', true)->get();База данных намного эффективнее обрабатывает фильтрацию и агрегирование.
6. Отсутствие индексов в базе данных
Если вы выполняете запросы по колонкам без индексов (например, user_id в WHERE или JOIN), база вынуждена сканировать всю таблицу, что особенно больно на больших объёмах данных.
Как исправить: добавьте индексы:
$table->index('user_id');Если колонка часто участвует в where, orderBy или joinто ей скорее всего нужен индекс.
7. Пропуск кэша маршрутов и конфигурации
Laravel имеет встроенные механизмы кэширования конфигурации, маршрутов и представлений, но многие команды забывают их запускать при деплое.
Запустите на проде:
php artisan config:cache
php artisan route:cache
php artisan view:cache
Или универсально:
php artisan optimizeЭто уменьшает число обращений к файловой системе и ускоряет загрузку приложения. Эти опции не нужны в локальной разработке, только на продакшене.
8. Чрезмерное использование коллекций
Коллекции (Collection) выглядят элегантно, но при обработке больших массивов данных могут съедать много памяти и снижать скорость.
Как исправить:
Делайте группировки и фильтрации в SQL.
Для больших наборов данных используйте
cursor()вместоall(). Он читает записи по одной, без нагрузки на память.Пагинация всегда помогает держать нагрузку под контролем.
Производительность Laravel-приложения часто не зависит от самого фреймворка, а определяется тем, как мы пишем код и организуем работу с данными. Если следить за количеством запросов, активно использовать кэш, выносить тяжёлую работу в очереди, доверять фильтрацию базе данных, то даже большие и сложные приложения могут работать очень быстро, не отказываясь от удобства Laravel.