Час відповіді API складається з запитів до бази, гідрації моделей Eloquent, серіалізації ресурсів і розміру відповіді. Оптимізація - по кожному кроку, після вимірювання.
1. Запити до бази:
- N+1 -
with()у контролері,whenLoadedу ресурсах,Model::preventLazyLoading()у розробці; - лише потрібні колонки:
select(['id', 'title', 'author_id', 'created_at'])- менше даних з бази і менше пам'яті на гідрацію (не забути зовнішні ключі дляwith); - агрегати в базі:
withCount,withSumзамість завантаження зв'язків для підрахунку; - індекси під фільтри й сортування ендпойнта.
2. Обсяг відповіді:
- пагінація обов'язкова для колекцій, з верхньою межею
per_page; cursorPaginate/simplePaginate- безCOUNT(*)на великих таблицях;- розріджені поля й включення на вимогу (
?fields[posts]=id,title,?include=author) - клієнт отримує лише потрібне. ВбудованийJsonApiResourceLaravel 13 підтримує обидва механізми за специфікацією JSON:API; - стиснення (gzip/brotli) на рівні вебсервера.
3. Гідрація й серіалізація:
- Eloquent-моделі дорогі для тисяч рядків. Для великих вивантажень -
toBase()/query builder без моделей абоlazy()/cursor()з потоковою відповіддю (response()->streamJson()), а не масив у пам'яті; - важкі обчислення в
toArray(форматування, URL, звернення до сервісів) множаться на кількість елементів - винести в запит чи кеш.
4. Кешування:
- HTTP-кешування:
ETag/Last-Modifiedі304 Not Modified- клієнт не завантажує незмінене;Cache-Controlдля публічних даних - кеш на CDN; - кеш застосунку для дорогих агрегацій (
Cache::flexible()- stale-while-revalidate: віддає застаріле значення й оновлює у фоні); - кеш на рівні запитів до бази - точково, з продуманою інвалідацією.
5. Інфраструктура:
- Octane (FrankenPHP, Swoole, RoadRunner) - застосунок у пам'яті між запитами, без завантаження фреймворку на кожен запит;
- черги для всього, що не потрібне для відповіді (листи, вебхуки, аналітика);
- асинхронні операції -
202 Acceptedз посиланням на статус для довгих задач замість очікування в запиті.
Як вимірювати: Telescope/Debugbar (кількість запитів і час), Pulse (повільні ендпойнти й запити в продакшені), профайлер для гарячих точок у серіалізації. Оптимізація без вимірювань часто прискорює не те.