Я пытаюсь создать приложение для прикрепленного Symfony. Проблема заключается в том, что контейнер DI создается во время сборки контейнера Docker, что означает, что я не могу вставлять в него параметры времени выполнения. До сих пор я решил очистить кеш в точке входа в контейнер, но я понял, что в некоторых случаях это может быть довольно тяжелая операция, поэтому я создал пользовательскую функцию компиляции в AppKernel на основе функции загрузки ядра:Перекомпилировать контейнер Symfony вручную
/**
* Recompiles the container without warming up the whole cache.
*
* Can be called upon docker container start to inject custom parameters.
*/
public function compile()
{
// Load class cache
if ($this->loadClassCache) {
$this->doLoadClassCache($this->loadClassCache[0], $this->loadClassCache[1]);
}
// Initialize bundles to be able to parse configurations
$this->initializeBundles();
$class = $this->getContainerClass();
$cache = new ConfigCache($this->getCacheDir().'/'.$class.'.php', $this->debug);
$container = $this->buildContainer();
$container->compile();
$this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass());
}
Эта функция теперь будет вызываться при каждом запуске контейнера Docker (до запуска приложения).
Это безопасная операция? Должен ли я предположить, что любые нагреватели кэша могут полагаться на параметры контейнера? (Так как я изменяю только время выполнения параметров контейнера, сервисы и все остальное должны оставаться неизменными).
Первоначально спросил вопрос в Symfony репо: https://github.com/symfony/symfony/issues/19525
PR в мой пользовательский репозиторий: https://github.com/webplates/symfony-standard/pull/42
Не хватит ли запуска кеша: clear/cache: warmup при создании контейнера в среде prod? Тогда никогда не трогайте их снова? Я не понимаю разницу между вашим ручным подходом и пустым каталогом кеша? – mblaettermann
Я имею в виду: Symfony делает то же самое внутри. Зачем изобретать колесо? – mblaettermann
Cache clear - не очень хорошая идея, потому что это может быть тяжелая операция (как я уже указывал). Оставляя кеш-память пустым или просто вручную удаляя встроенный контейнер, оба заканчиваются разминкой. В некоторых случаях разминка может даже занять минуту, что неприемлемо в контейнерной инфраструктуре. –