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


Cache issue with dynamic parameter in config.yml

我有一个多站点应用程序,其中的日志系统取决于每个站点,我希望每个站点都有自己的日志文件,所以我做到了:

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=>%domain_name%的值是"site1.com",所以它有效罚款
  • 我切换到www.site2.com=>%domain_name%值始终为"site1.com",并且不是"site2.com">

为什么

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

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

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

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

有些人建议为每个站点创建不同的环境。但当你拥有成百上千或数百万个网站时,这是不现实的。

备用缓存位置目前,我们能想到的最佳解决方案是为每个站点指定不同的缓存文件夹。因此,您扩展了app/appKernel.php并自定义了getCacheDir函数。

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

请参阅内核的API参考。

我不太确定您是否按预期使用了参数文件/配置。

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

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-config或htaccess文件中的控制器。我认为你可以将app.php控制器更改为

[...]
require_once __DIR__.'/../app/AppKernel.php';
$request = Request::createFromGlobals();
$kernel = new AppKernel($request->giveMeMyHostEnvironmentMappingShizzle(), false);
$kernel->loadClassCache();
[...]

关于的种类