我有一个多站点应用程序,其中的日志系统取决于每个站点,我希望每个站点都有自己的日志文件,所以我做到了:
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();
[...]
关于的种类