Laravel — конфетка для разработчика. Но как только приложение выходит за пределы pet-project’а, внезапно становится понятно: оно работает медленнее, чем бабушкин ноут с Windows XP. Причина почти всегда одна и та же — руки. Точнее, привычка писать «как удобно», а не «как правильно».
Давай пройдёмся по самым частым косякам.
1. N+1 запросов — убийца новичков
Классика:
$users = User::all();
foreach ($users as $user) {
echo $user->profile->name;
}
Каждому пользователю — отдельный запрос. База кряхтит, а ты недоумеваешь, почему 100 юзеров тянут 101 запрос.
Решение: жадная загрузка.
$users = User::with('profile')->get();
foreach ($users as $user) {
echo $user->profile->name;
}
Вместо сотни запросов — один нормальный join.
2. Нет кэша — нет жизни
Если ты каждый раз дёргаешь базу ради одних и тех же данных — готовься к боли.
// Плохо $users = User::orderByDesc('id')->limit(10)->get();
// Лучше $users = Cache::remember('users', 60, function () {
return User::orderByDesc('id')->limit(10)->get();
});
Кэш — это костыль, но без него в Laravel никуда. Только не забудь инвалидировать кэш при обновлении данных, а то будешь долго искать баги, когда юзер поменял аватар, а у тебя в логах «ничего не обновлялось».
3. Конфиги и память
php.ini никто не трогает, потому что «и так работает». Потом начинается веселье: скрипт падает с Allowed memory size exhausted.
; Было memory_limit = 128M
; Стало memory_limit = 512M
Память — не резиновая, но иногда достаточно просто не быть жмотом.
4. Индексы в базе
Без индексов твой запрос на поиск пользователя по email будет делать полный скан таблицы из миллиона строк.
Schema::table('users', function (Blueprint $table) {
$table->index('email');
});
Минус — индексы жрут место. Плюс — у тебя снова работает сайт.
5. Клиентская часть — привет, фронтендеры
Да, Laravel тут ни при чём, но половина тормозов идёт с фронта. Неоптимизированные картинки по 5 МБ, 20 подключённых CSS, десяток JS, из которых половина можно было выкинуть.
<link rel="stylesheet" href="/css/style.min.css">
<script src="/js/script.min.js"></script>
CDN + минификация — и хотя бы фронт перестанет унижать твой бэкенд.
6. «Жрёт CPU, но это же Laravel»
Любимая отмазка. На самом деле проблема чаще в том, что:
- логи пишутся в файл без ротации (и каждая запись идёт через
fopen/fclose), - воркеры Queue крутятся без рестарта неделями и собирают память как пылесос,
- Blade-шаблоны рендерятся по 100 раз без кэша.
- «а давай сделай по быстрому» - менеджеру надо быстро выкатить фичу и некогда тратить время на эти ваши оптимизации.
Вывод
Laravel не тормозит «сам по себе». Его тормозят люди, которые не думают о производительности: пишут N+1, не ставят кэш, не настраивают конфиги и даже не делают индексы.
0 комментариев