Php Symfony 2-多服务器配置
我们开始在工作中的项目中采用Symfony 2,这很好,但我正在努力解决一个挑战,我几乎已经解决了,但还没有完全解决 Symfony将环境的概念视为单个服务器上的独立运行时。这很好,因为您可以使用不同的前端控制器(web)在运行时之间切换,也可以随心所欲地使用env开关(cli) 但是,我们的代码作为开发过程的一部分部署在许多服务器上。每个人都有一个本地VM,然后代码通过集成、QA、登台,最后是生产向上传播 因此,我们对环境的概念是服务器(虚拟或物理)。以下是此自定义配置的目标Php Symfony 2-多服务器配置,php,configuration,symfony,Php,Configuration,Symfony,我们开始在工作中的项目中采用Symfony 2,这很好,但我正在努力解决一个挑战,我几乎已经解决了,但还没有完全解决 Symfony将环境的概念视为单个服务器上的独立运行时。这很好,因为您可以使用不同的前端控制器(web)在运行时之间切换,也可以随心所欲地使用env开关(cli) 但是,我们的代码作为开发过程的一部分部署在许多服务器上。每个人都有一个本地VM,然后代码通过集成、QA、登台,最后是生产向上传播 因此,我们对环境的概念是服务器(虚拟或物理)。以下是此自定义配置的目标 在运行时环境切换
[parameters]
server="int"
[parameters]
# ...
server.env="int"
server.title="Integration"
server.name="Int 1"
然后,在内核中,基于该值加载一个额外的配置文件。例如,我很想让它工作,但它没有工作(因为在这个步骤中容器还不存在)
app/AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
// Per-server config
$server = $this->getContainer()->getParameter( 'server' );
if ( $server )
{
$loader->load(__DIR__.'/config/server/'.$server.'.yml');
}
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
// Symfony environment config
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
// Load server config, if it exists
$parameters = parse_ini_file( __DIR__.'/config/parameters.ini', true );
if ( $parameters && isset( $parameters['parameters']['server.env'] ) )
{
$serverConfig = __DIR__.'/config/server/'.$parameters['parameters']['server.env'].'.yml';
if ( file_exists( $serverConfig ) )
{
$loader->load( $serverConfig );
} else {
error_log( 'Server config defined, but no config file found. Looked for ' . $serverConfig );
}
}
}
这将允许使用像app/config/server/int.yml这样的文件,开发人员可以使用该文件控制非私有(即非parameters.ini)配置值
谢谢你的阅读,如果有什么让我困惑的地方,请告诉我
编辑
澄清一下,我不能使用或依靠的东西
- *从用户配置文件或通过
导出nix环境变量。为什么?集成、QA和登台可能都在同一个框中export
- vhost配置中的任何内容(不适用于cli)
- 静态命名的文件(即,仅命名为server.ini的文件将不起作用)
- 好的,我终于想出了该怎么办。实际上只需要对AppKernel进行基本修改
app/AppKernel.php
public function registerContainerConfiguration(LoaderInterface $loader)
{
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
// Per-server config
$server = $this->getContainer()->getParameter( 'server' );
if ( $server )
{
$loader->load(__DIR__.'/config/server/'.$server.'.yml');
}
}
public function registerContainerConfiguration(LoaderInterface $loader)
{
// Symfony environment config
$loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
// Load server config, if it exists
$parameters = parse_ini_file( __DIR__.'/config/parameters.ini', true );
if ( $parameters && isset( $parameters['parameters']['server.env'] ) )
{
$serverConfig = __DIR__.'/config/server/'.$parameters['parameters']['server.env'].'.yml';
if ( file_exists( $serverConfig ) )
{
$loader->load( $serverConfig );
} else {
error_log( 'Server config defined, but no config file found. Looked for ' . $serverConfig );
}
}
}
app/config/parameters.ini
[parameters]
server="int"
[parameters]
# ...
server.env="int"
server.title="Integration"
server.name="Int 1"
现在我可以根据需要在app/config/server/中创建%server.env%.yml文件
多亏了那些读过这篇文章的人——我最初想到的是更复杂的东西,它让这个简单的解决方案暂时看不见;) 为什么您认为需要使用Symfony2环境来处理您的服务器环境?从本质上来说,我不是。我只是想找出最好的方法来加载每个服务器的配置,这些配置仍在开发人员的控制之下。您仍然可以使用
parse_ini_file
方法解析parameters.ini
。虽然我不清楚你的问题。您是说每个服务器配置文件将具有不同的路由/安全配置吗?您可以阅读下面的解决方案。这是一个很难描述的场景,希望解决方案能让它更清晰。