config.yml中的动态参数缓存问题

时间:2014-05-23 07:45:21

标签: php symfony caching configuration

我有一个多站点应用程序,日志系统依赖于每个站点,我希望每个站点都有自己的日志文件,所以我这样做了:

1)我在config.yml中使用动态变量,取决于$_SERVER['HTTP_HOST']

config.yml:

imports:
    - { resource: param.php }

    ...

monolog:
    handlers:
        user:
            type: stream
            path: %kernel.logs_dir%/%domain_name%.%log_filename%
            channels: [user]

=> %domain_name%是我的动态变量

2)我在app / config / param.php中设置了它:

<?php

$url = $_SERVER['HTTP_HOST'];

$domain = preg_replace('/^www./', '', $url);

$container->setParameter('domain_name', $domain); // this set my variable `%domain_name%` with the current domain (ex: site1.com)

问题:

此代码工作正常,但当我切换到其他网站时,%domain_name%的值仍然等于其初始值。

例如:

  • 我在www.site1.com =&gt; %domain_name%值为“site1.com”,因此可行 细
  • 我切换到www.site2.com =&gt; %domain_name%值始终为“site1.com”和 不是“site2.com”

为什么?

缓存问题。实际上,Symfony在缓存config.yml中加载,因此它保留了%domain_name%的第一个值

要删除此值,我必须执行此命令:rm -rf app/cache/*但它不是解决方案。

所以没有人能解决这个问题?感谢

2 个答案:

答案 0 :(得分:1)

我们在多站点CMS环境中遇到了同样的问题。 Symfony主要用于运行单个站点,因此config.yml运行一次,然后缓存。这意味着如果您将动态参数注入config.yml(通过任何方式:Globals,Constants,Apache Environment等),在第一次运行后,它们将被缓存以用于每个后续请求:(因此下一个唯一的域站点请求将是使用第一个站点的缓存值。在大多数情况下,这会产生问题。

有些人建议为每个网站创建不同的环境。但是,当您托管数百,数千或数百万个网站时,这是不切实际的。

替代缓存位置 目前,我们可以设想的最佳解决方案是每个站点specify a different cache folder。因此,您可以扩展app/appKernel.php并自定义getCacheDir函数。

//app/appKernel.php
class AppKernel extends Kernel
{
    public function getCacheDir()
    {
        return $this->rootDir.'/cache/'.$this->environment.'/'.$_SERVER['HTTP_HOST'];
    }
}

请参阅API Reference for Kernel

答案 1 :(得分:0)

如果您按预期使用参数文件/配置,我不太确定。

对我来说,缺少信息,直接回答你的问题,所以这里有两种可能的情况:

1)网站www.site1.com和www.site2.com指向相同的来源(同一台服务器):

在这种情况下,我不会将domain_name定义为配置值,当然它不是一个独特的配置参数,它更像是一个变量。构建服务或考虑定义其他环境。

2)www.site1.com和www.site2.com是两个截然不同的项目:

在这种情况下,你不应该部署缓存目录的内容(无论如何你应该这样做;但在这种情况下,这将是问题;))。

修改 您可以实现不同的配置文件来解决:

  • config_site1.yml#www.site1.com的配置
  • config_site2.yml#www.site2.com的配置

/ web目录中的控制器:

  • app_site1.php
  • app_site2.php

使用请求的环境初始化AppKernel,并指向vhost配置或htaccess文件中的控制器。 我认为您可以将app.php控制器更改为:

[...]
require_once __DIR__.'/../app/AppKernel.php';

$request = Request::createFromGlobals();

$kernel = new AppKernel($request->giveMeMyHostEnvironmentMappingShizzle(), false);
$kernel->loadClassCache();
[...]

亲切的问候