Остановите лавины N+1: принудительно включите Laravel Strict Mode
Проблема запросов N+1 убивает производительность базы данных. Она возникает, когда вы извлекаете список записей и перебираете их в цикле для доступа к связанным данным. Вы забыли загрузить эту связь заранее.
Представьте, что вы отображаете 50 инвойсов на панели управления. Вы проходите по ним циклом, чтобы вывести имя клиента. Вы забыли использовать метод with. Eloquent выполняет 1 запрос для получения инвойсов, а затем еще 50 отдельных запросов для каждого клиента.
При локальной разработке 51 запрос занимает 10 миллисекунд. Вы этого даже не заметите. Но в продакшене при высоком трафике это превращается в лавину. Это истощает пул соединений с базой данных и приводит к падению сервера.
Нельзя полагаться только на ревью кода. Вам нужен архитектурный предохранитель.
Laravel предлагает Strict Mode для решения этой проблемы. Вы можете использовать preventLazyLoading на уровне приложения. Laravel будет отслеживать ваши связи в базе данных. Если во время локальной разработки или тестирования обнаружится ленивая загрузка, система выбросит исключение. Это заставит вас немедленно исправить код.
Как это настроить:
Настройте механизм защиты в вашем AppServiceProvider. Сделайте это для сред local и testing. В продакшене вместо падения приложения ошибку следует записывать в лог.
Используйте эти три настройки в методе boot:
Model::preventLazyLoading: останавливает запросы N+1.Model::preventSilentlyDiscardingAttributes: предотвращает ошибки массового заполнения.Model::preventAccessingMissingAttributes: предотвращает утечки памяти из-за отсутствующих связей.
Для продакшена используйте handleLazyLoadingViolationUsing. Это позволит вам отправлять отчеты о нарушениях в Slack или другой сервис логирования. Вы получите контроль над ситуацией, не нарушая пользовательский опыт.
Использование Strict Mode переносит оптимизацию на самый ранний этап разработки. Запросы N+1 просто не пройдут тесты. Ваш код будет оставаться оптимизированным, а база данных — быстрой.
Источник: https://dev.to/iprajapatiparesh/stop-n1-avalanches-enforce-laravel-strict-mode-2oop