我目前正在为我们公司从事symfony项目。而且我在解决如何从环境变量构建动态配置方面遇到问题。
我的主要问题是symfony一次缓存了我的“ defaut_database”,然后再对其进行更改。我愿意使用在我创建的每个Vhost中定义的变量对此进行更改。
这是我的Vhost配置:
<Macro demoVHost ${slug}>
<VirtualHost *:80>
ServerName ${slug}.domain.com
DocumentRoot /home/domain/www/web
SetEnv SYMFONY__DYNAMIC__DATABASE_NAME db_${slug}
<Directory /home/domain/www/web>
AllowOverride None
Order Allow,Deny
Allow from All
Require all granted
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ app_demo.php [QSA,L]
</IfModule>
</Directory>
ErrorLog /home/demo/log/${slug}.error.log
CustomLog /home/demo/log/${slug}.access.log combined
</VirtualHost>
</Macro>
Use demoVHost aaa
Use demoVHost bbb
Use demoVHost ccc
还有我的.yml配置:
doctrine_mongodb:
connections:
default:
server: 'mongodb://127.0.0.1:27017'
options: {}
default_database: "%dynamic.database_name%"
答案 0 :(得分:0)
您可以使用不同的环境来与不同的数据库一起使用。因此,每个环境都将使用保留的数据库连接设置生成自己的容器缓存文件。所有环境都可以对所有项目文件使用共享的APC缓存,但可以使用自己的设置。
要使其成为可能,您不需要任何.htaccess
,只需编辑app.php
:
$domainParts = explode('.', $_SERVER['SERVER_NAME']);
if (count($domainParts) === 3) { // If you have domains like aaa.domain.com, bbb.domain.com and so on
$instance = $domainParts[0];
} else { // If user request "not right" domain like aaa.aaa.domain.com or domain.com
$instance = 'prod';
}
$loader = new ApcClassLoader('your-apc-prefix-to-have-all-files-shared-across-all-instances', $loader);
$loader->register(true);
require_once __DIR__.'/../app/AppKernel.php';
//require_once __DIR__.'/../app/AppCache.php';
$kernel = new AppKernel($instance, false);
然后,您需要为域app/config/config_aaa.yml
创建名称为aaa.domain.com
,域app/config/config_bbb.yml
为bbb.domain.com
的适当配置文件,依此类推。每个配置文件都包含数据库配置并导入主config.prod
文件:
imports:
- { resource: config_prod.yml }
doctrine_mongodb:
default_database: 'aaa' # or 'bbb', 'ccc' — for concrete domain
可以在config_prod.yml
中放置的所有环境的常用配置:
doctrine_mongodb:
connections:
default:
server: 'mongodb://127.0.0.1:27017'
options: {}
答案 1 :(得分:0)
我的主要目标是允许在单个环境中创建无限数量的演示平台,但每个平台都有专用的数据库-自动且无需手动。
domain_AAA => app_demo.php/config_demo.php => db_AAA
domain_BBB => app_demo.php/config_demo.php => db_BBB
domain_CCC => app_demo.php/config_demo.php => db_CCC
因此,要解决我的问题,我只是想在我的“演示”环境的缓存目录中创建一个附加级别,并且它运行良好。
在我的AppKernel.php文件中。
public function getCacheDir()
{
if ($this->getEnvironment() === 'demo') {
return dirname(__DIR__).'/var/cache/'.$this->getEnvironment() . '/' . $this->getEnvParameter('subdomain');
}
return dirname(__DIR__).'/var/cache/'.$this->getEnvironment();
}
public function getEnvParameter($name)
{
$envParameters = $this->getEnvParameters();
return array_key_exists($name, $envParameters) ? $envParameters[$name] : null;
}