Skip to content

Feature Compiled

github-actions[bot] edited this page Jul 8, 2026 · 1 revision

🚀 Compiled container

← Возможности · Главная · Сравнение

Предсобранный контейнер для продакшена: граф зависимостей превращается в сгенерированный PHP-класс — без рефлексии в рантайме. Туториал — Compiled-container.

Принцип работы

ContainerCompiler берёт настроенный runtime-Container и генерирует класс-наследник AbstractCompiledContainer, где для каждого сервиса выписан прямой код создания (инлайн зависимостей конструктора). Скомпилированный get() — крошечный: прямой возврат из fastResolved или инлайн-сборка, без reflection/alias-резолва.

// сборка (deploy-шаг):
$compiler = new ContainerCompiler();
$compiler->compile($runtimeContainer, __DIR__ . '/cache', 'AppCompiledContainer');

// runtime (prod):
require __DIR__ . '/cache/AppCompiledContainer.php';
$c = new AppCompiledContainer();
$c->get(ReportService::class); // без рефлексии, максимально быстро

В честных замерах compiled get() и создание сервисов у CloudCastle быстрее Symfony PhpDumper, PHP-DI и Nette (см. Производительность).

Плюсы

  • Максимальная скорость в проде: нет рефлексии, прямой код разрешения.
  • Ошибки графа всплывают на этапе компиляции, а не в рантайме.
  • Паритет API с runtime-контейнером (тот же get/make/has, lifecycle scope).

Минусы

  • Нужен шаг компиляции в деплое; после правок графа контейнер надо пересобрать.
  • Регистрация scoped-сервисов — только в runtime-Container (в compiled — lifecycle scope).
  • Сгенерированный файл нужно куда-то класть и кэшировать.

✅ Рекомендуется

  • Компилировать на этапе сборки/деплоя, коммитить/кэшировать артефакт, в проде — только require.
  • Dev — runtime-контейнер (быстрый цикл правок), prod — compiled.

❌ Антипаттерны

  • Компилировать на каждый запрос в рантайме — теряется весь смысл (это deploy-шаг).
  • Держать в проде runtime-рефлексию ради «удобства» на нагруженных эндпоинтах.

Аналоги в других контейнерах

Контейнер Аналог
PHP-DI compiled container (enableCompilation())
Symfony ContainerBuilder::compile() + PhpDumper (эталон)
Laravel нет compiled-контейнера (❌)
Pimple нет (❌)
Nette скомпилированный DI-контейнер (ядро подхода)

CloudCastle, PHP-DI, Symfony, Nette; CloudCastle — быстрейший compiled в замерах.

См. также: Compiled-container (гайд) · freeze() · Производительность.

Clone this wiki locally