2016-10-28 4 views
0

Нам необходимо сохранить наши файлы кеша и журнала вне структуры папок проекта. Я установил параметры_prod.yml и parameters_dev.yml, которые будут созданы Bamboo при развертывании на разных серверах/средах.Загрузка параметра Symfony в AppKernel

Есть ли способ доступа к этим параметрам в AppKernal, чтобы я мог использовать их в функции getCacheDir()? Это было бы легким способом сделать что-то, кроме того, что он сам их разбирал.

Таким образом, конечная структура каталогов должна выглядеть так же, как и по умолчанию для Symfony, за исключением кеша и журналов. Команда сервера запросила, чтобы кэш и журналы были в разделе var/tmp и var/logs. Таким образом, для приложения кеш будет/var/tmp/symfony/projectName/prod и/var/tmp/symfony/projectName/dev. Журналы будут следовать аналогичной структуре.

Таким образом, в основном структура будет следовать за обычным символом Symfony, за исключением того, что/var/www/Symfony/projectName/var/cache становится/var/tmp/symfony/projectName и/var/www/Symfony/projectName/var/logs становится/вар/журналы/Symfony/Projectname. Обратите внимание, что все эти места здесь абсолютные (и расположение корня проекта может немного отличаться, когда Bamboo разворачивается, он будет устанавливать правильные пути и т. Д.).

Одна из странных вещей заключается в том, что когда я настраивал это так, сайт фактически запускается, но я ничего не вижу в новом местоположении кеша (еще не начал работать со стороны журналов). Таким образом, где-то должны быть файлы кеша, но местоположение их даже не находит!

ПРИМЕЧАНИЕ. Теперь я обнаружил, что при запуске внутреннего сервера эта проблема не возникает. Это происходит, только если вы загружаете сайт под Apache.

ответ

1

Проблема с вашей идеей заключается в том, что контейнер службы и параметры инициализируются через мгновение после создания объекта ConfigCache с абсолютным направлением кэша в качестве параметра.

namespace Symfony\Component\HttpKernel; 

... 


/** 
* The Kernel is the heart of the Symfony system. 
* 
* It manages an environment made of bundles. 
* 
* @author Fabien Potencier <[email protected]m> 
*/ 
abstract class Kernel implements KernelInterface, TerminableInterface 
{ 
    ... 
     /** 
    * Initializes the service container. 
    * 
    * The cached version of the service container is used when fresh, otherwise the 
    * container is built. 
    */ 
    protected function initializeContainer() 
    { 
     $class = $this->getContainerClass(); 
     // !!!!!! cache config object construction 
     $cache = new ConfigCache($this->getCacheDir().'/'.$class.'.php', $this->debug); 
     $fresh = true; 
     if (!$cache->isFresh()) { 
      $container = $this->buildContainer(); 
      $container->compile(); 
      $this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass()); 

      $fresh = false; 
     } 

     require_once $cache->getPath(); 

     $this->container = new $class(); 
     $this->container->set('kernel', $this); 

     if (!$fresh && $this->container->has('cache_warmer')) { 
      $this->container->get('cache_warmer')->warmUp($this->container->getParameter('kernel.cache_dir')); 
     } 
    } 
} 

Таким образом, вы не можете получить доступ к своим настраиваемым параметрам в методе getCacheDir().

Не могли бы вы переопределить метод getCacheDir()?

Допустим, что ваша структура каталогов выглядит следующим образом

-home 

--symfony_app 

--custom_cache_directory 

чем метод переопределения будет выглядеть примерно так:

public function getCacheDir() 
{ 
    return dirname(__DIR__).'/../custom_cache_directory/cache/'.$this->getEnvironment(); 
} 

Более подробная информация на официальной документации: http://symfony.com/doc/current/configuration/override_dir_structure.html#override-the-cache-directory

+0

Это метод, с которым я играл, только я пытаюсь уйти от использования dirname (\ _ \ _ DIR \ _ \ _), поскольку каталог может быть не относительно каталога app. Теперь я получаю его для использования:/var/tmp/symfony/appname/branchname/dev, например. Когда я это делаю, приложение загружается, но я не знаю, где находится кеш, я не могу найти его нигде! – MicWit

+0

Не могли бы вы высказать мне всю вашу структуру каталогов - приложение, ваш кэш-браузер, ваш кэш prod ... –

+0

Обновите вопрос, чтобы включить более подробную информацию. – MicWit

0

Таким образом, ответ должен сделать, как предложил Матко, и НЕ использовать каталог/var/tmp.

Так в /appName/app/AppKernel.php я редактировал getCacheDir(), чтобы сделать его более похожим:

public function getCacheDir() 
{ 
    return '/var/symfony/cache/projectName' . '/' . $this->getEnvironment(); 
} 

или любой другой путь, который вы хотите использовать.

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

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