Содержание

Laravel-приложение чаще всего тормозит не из-за фреймворка, а из-за лишних запросов к базе данных, отсутствия кеша и тяжёлой работы прямо в запросе пользователя. Обычно ускорение начинается с профилирования, устранения проблемы N+1, индексов, кеширования и выноса долгих операций в очереди. Эти шаги дают кратный эффект без переписывания проекта.

Разберём, как найти медленные места, какие оптимизации дают наибольший эффект и когда стоит переходить на Octane.

Как найти, что тормозит?

Найти медленные места помогает профилирование: инструменты показывают, сколько запросов к базе выполняет каждая страница, какие из них медленные и сколько времени уходит на внешние вызовы. Оптимизировать вслепую бесполезно — можно потратить неделю на то, что занимает 2% времени.

Чем пользоваться:

  • Laravel Debugbar или Telescope — в разработке видно количество и время запросов на каждой странице;
  • журнал медленных запросов базы данных на продакшене;
  • APM-сервис — показывает самые медленные эндпоинты и их структуру на реальном трафике;
  • нагрузочный тест — проверяет, как поведёт себя приложение под пиком, подробнее в статье нагрузочное тестирование.

Как избавиться от проблемы N+1?

Проблема N+1 возникает, когда код загружает список записей одним запросом, а затем для каждой записи делает ещё один запрос за связанными данными. Для списка из 50 заказов это 51 запрос вместо двух. Решение — жадная загрузка связей через with().

// Плохо: 1 запрос за заказами + 50 запросов за клиентами
$orders = Order::latest()->take(50)->get();
foreach ($orders as $order) {
    echo $order->customer->name;
}

// Хорошо: 2 запроса
$orders = Order::with('customer')->latest()->take(50)->get();

// В разработке запретить ленивую загрузку, чтобы ловить N+1 сразу
Model::preventLazyLoading(! app()->isProduction());

Дополнительно помогают выборка только нужных колонок, withCount() вместо подсчёта в цикле и индексы под частые условия — подробнее в статье индексы в PostgreSQL.

Хромированные детали двигателя крупным планом Фото: Unsplash

Какие настройки ускоряют любое Laravel-приложение?

Есть набор настроек, которые ускоряют любое приложение на продакшене и не требуют изменений в коде: кеширование конфигурации, маршрутов, событий и представлений, OPcache и актуальная версия PHP. Их стоит включить в скрипт деплоя.

Действие Что даёт
php artisan optimize Кеширует конфигурацию, маршруты, события и представления
OPcache с отключённой проверкой файлов PHP не компилирует код на каждый запрос
composer install --optimize-autoloader --no-dev Быстрая автозагрузка классов, без пакетов разработки
Актуальная версия PHP Прирост скорости от каждого релиза языка
Redis для кеша и сессий Быстрее файлов и базы данных

Про новые версии языка мы писали в статье PHP 8.6: релиз-кандидат, а про Redis — в материале Redis в веб-проекте.

Что вынести в кеш и очереди?

В кеш выносят то, что дорого считать и редко меняется: каталог, меню, настройки, результаты тяжёлых отчётов. В очереди — всё, что пользователю не нужно ждать: отправку писем, генерацию PDF, обработку изображений, вызовы внешних API.

Кеширование:

  1. Кешируйте результаты запросов с понятным ключом и сбрасывайте кеш при изменении данных.
  2. Используйте теги кеша, чтобы сбрасывать связанные записи разом.
  3. Не кешируйте персональные данные под общим ключом.

Очереди:

  1. Запрос пользователя только ставит задачу и сразу возвращает ответ.
  2. Для разных задач — разные очереди с приоритетами.
  3. Неудачные задачи повторяются, а после нескольких попыток попадают в отдельный список для разбора.

Подробнее — в статьях кеширование в веб-приложении и очереди задач.

Когда переходить на Laravel Octane?

Octane стоит рассматривать, когда запросы к базе и кеш уже оптимизированы, а значительная часть времени ответа уходит на загрузку фреймворка. Octane держит приложение в памяти между запросами и убирает эти накладные расходы, но требует следить за состоянием, которое может «протечь» между пользователями.

Перед переходом проверьте:

  • нет ли в коде статических свойств и синглтонов, хранящих данные пользователя;
  • совместимы ли используемые пакеты с долгоживущим процессом;
  • есть ли нагрузочный тест, который покажет реальный выигрыш.

Коротко

  • Начинайте с профилирования, а не с догадок.
  • Устраните N+1 через with() и включите запрет ленивой загрузки в разработке.
  • Включите кеш конфигурации и маршрутов, OPcache и актуальный PHP.
  • Тяжёлые данные кешируйте, долгие операции выносите в очереди.
  • Octane — следующий шаг, когда остальное уже оптимизировано.

Частые вопросы

  • Laravel медленнее других фреймворков?

    Накладные расходы фреймворка на запрос невелики по сравнению со временем запросов к базе и внешним сервисам. В реальных проектах скорость определяется кодом приложения и архитектурой, а не выбором фреймворка.

  • Нужно ли переходить на Octane?

    Только если после оптимизации запросов, кеша и очередей узким местом остаётся загрузка фреймворка на каждый запрос, а нагрузка высокая. Octane требует аккуратности с состоянием между запросами.

  • Какая версия PHP нужна для лучшей производительности?

    Актуальная поддерживаемая версия: каждый релиз PHP приносит улучшения производительности, а старые версии перестают получать исправления безопасности. Обновление версии — одно из самых дешёвых ускорений.