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, не ставят кэш, не настраивают конфиги и даже не делают индексы.