0

我们需要将缓存和日志文件存储在项目文件夹结构之外。我已经设置了 parameters_prod.yml 和 parameters_dev.yml,它们将由 Bamboo 在部署到不同的服务器/环境时构建。

有什么方法可以在 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 变成 /var/logs /symfony/项目名称。请注意,这里所有这些位置都是绝对的(项目根目录的位置可能略有不同,当 Bamboo 部署时,它会设置正确的路径等)。

奇怪的事情之一是,当我像这样设置它时,该站点实际上运行了,但是我在新的缓存位置下看不到任何东西(还没有开始在日志方面工作)。因此,某处必须有缓存文件,但定位器甚至找不到它们!

注意:我现在发现如果你运行内部服务器,这个问题就不会发生。仅当您在 Apache 下加载站点时才会发生这种情况。

4

2 回答 2

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 <fabien@symfony.com>
 */
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

于 2016-10-28T09:35:14.260 回答
0

所以答案是按照 Matko 的建议去做,不要使用 /var/tmp 目录。

所以在 /appName/app/AppKernel.php 我编辑了 getCacheDir() 使它看起来更像:

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

或您想使用的任何路径。

不要在 /tmp 或 /var/tmp 下使用任何东西(我在 RHEL 上),因为这些文件夹会做一些奇怪的事情(/var/tmp 似乎从未真正将缓存写入磁盘)。

于 2016-11-01T04:58:36.950 回答