我有一个多站点应用程序,日志系统依赖于每个站点,我希望每个站点都有自己的日志文件,所以我这样做了:
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%的值仍然等于其初始值。
例如:
%domain_name%
值为“site1.com”,因此可行
细%domain_name%
值始终为“site1.com”和
不是“site2.com”为什么?
缓存问题。实际上,Symfony在缓存config.yml
中加载,因此它保留了%domain_name%
的第一个值
要删除此值,我必须执行此命令:rm -rf app/cache/*
但它不是解决方案。
所以没有人能解决这个问题?感谢
答案 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'];
}
}
答案 1 :(得分:0)
如果您按预期使用参数文件/配置,我不太确定。
对我来说,缺少信息,直接回答你的问题,所以这里有两种可能的情况:
1)网站www.site1.com和www.site2.com指向相同的来源(同一台服务器):
在这种情况下,我不会将domain_name定义为配置值,当然它不是一个独特的配置参数,它更像是一个变量。构建服务或考虑定义其他环境。
2)www.site1.com和www.site2.com是两个截然不同的项目:
在这种情况下,你不应该部署缓存目录的内容(无论如何你应该这样做;但在这种情况下,这将是问题;))。
修改强> 您可以实现不同的配置文件来解决:
/ web目录中的控制器:
使用请求的环境初始化AppKernel,并指向vhost配置或htaccess文件中的控制器。 我认为您可以将app.php控制器更改为:
[...]
require_once __DIR__.'/../app/AppKernel.php';
$request = Request::createFromGlobals();
$kernel = new AppKernel($request->giveMeMyHostEnvironmentMappingShizzle(), false);
$kernel->loadClassCache();
[...]
亲切的问候