Содержание
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.
Кеширование:
- Кешируйте результаты запросов с понятным ключом и сбрасывайте кеш при изменении данных.
- Используйте теги кеша, чтобы сбрасывать связанные записи разом.
- Не кешируйте персональные данные под общим ключом.
Очереди:
- Запрос пользователя только ставит задачу и сразу возвращает ответ.
- Для разных задач — разные очереди с приоритетами.
- Неудачные задачи повторяются, а после нескольких попыток попадают в отдельный список для разбора.
Подробнее — в статьях кеширование в веб-приложении и очереди задач.
Когда переходить на Laravel Octane?
Octane стоит рассматривать, когда запросы к базе и кеш уже оптимизированы, а значительная часть времени ответа уходит на загрузку фреймворка. Octane держит приложение в памяти между запросами и убирает эти накладные расходы, но требует следить за состоянием, которое может «протечь» между пользователями.
Перед переходом проверьте:
- нет ли в коде статических свойств и синглтонов, хранящих данные пользователя;
- совместимы ли используемые пакеты с долгоживущим процессом;
- есть ли нагрузочный тест, который покажет реальный выигрыш.
Коротко
- Начинайте с профилирования, а не с догадок.
- Устраните N+1 через
with()и включите запрет ленивой загрузки в разработке. - Включите кеш конфигурации и маршрутов, OPcache и актуальный PHP.
- Тяжёлые данные кешируйте, долгие операции выносите в очереди.
- Octane — следующий шаг, когда остальное уже оптимизировано.
Частые вопросы
Laravel медленнее других фреймворков?
Накладные расходы фреймворка на запрос невелики по сравнению со временем запросов к базе и внешним сервисам. В реальных проектах скорость определяется кодом приложения и архитектурой, а не выбором фреймворка.
Нужно ли переходить на Octane?
Только если после оптимизации запросов, кеша и очередей узким местом остаётся загрузка фреймворка на каждый запрос, а нагрузка высокая. Octane требует аккуратности с состоянием между запросами.
Какая версия PHP нужна для лучшей производительности?
Актуальная поддерживаемая версия: каждый релиз PHP приносит улучшения производительности, а старые версии перестают получать исправления безопасности. Обновление версии — одно из самых дешёвых ускорений.



