2016-08-04 5 views
4

Я пытаюсь создать приложение для прикрепленного 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

+0

Не хватит ли запуска кеша: clear/cache: warmup при создании контейнера в среде prod? Тогда никогда не трогайте их снова? Я не понимаю разницу между вашим ручным подходом и пустым каталогом кеша? – mblaettermann

+0

Я имею в виду: Symfony делает то же самое внутри. Зачем изобретать колесо? – mblaettermann

+0

Cache clear - не очень хорошая идея, потому что это может быть тяжелая операция (как я уже указывал). Оставляя кеш-память пустым или просто вручную удаляя встроенный контейнер, оба заканчиваются разминкой. В некоторых случаях разминка может даже занять минуту, что неприемлемо в контейнерной инфраструктуре. –

ответ

0

Это не может быть решен в общем, это полностью зависит от пучков, которые вы используете, и параметры, которые изменилось. Например, если ваша маршрутизация зависит от параметра (например, для установки хоста на маршруте), достаточно не, чтобы только перестроить контейнер, для восстановления маршрутизации требуется разминка.

Смежные вопросы