-
-
Notifications
You must be signed in to change notification settings - Fork 1
Feature Compiled
Предсобранный контейнер для продакшена: граф зависимостей превращается в сгенерированный 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() · Производительность.
CloudCastle DI · · PHP 8.1+ · PSR-11
GitHub · Packagist · Releases · Discussions · Сравнение
Исходники Wiki — каталог wiki/ в репозитории (синхронизация через GitHub Actions)
- 🏗️ Архитектура
- ⚡ Быстрый старт
- 📊 Сравнение — 5 аналогов, таблица + победители
- 🧩 Возможности (детально) — каждая фича: принцип, +/−, аналоги
- 🧪 Bootstrap
- 🚀 Compiled container
- 🔗 Contextual binding
- 🤖 Autowiring
- 📄 Конфигурация
- 📖 Справочник конфигурации
- 📂 Сканирование классов
- 🌍 Глобальный реестр
- 🏷️ Теги и декораторы
- 🔗 call(), bind(), hooks
- 🔄 Прототипы, alias, lazy, lazyGhost
- 📋 Справочник API
- 🏭 Фабрики и singleton