运行时配置Symfony 2


Configuring Symfony 2 at Runtime

我正在使用Symfony2为我的公司创建web服务。我们公司使用集中配置服务(Zookeeper/etcd)来管理我们服务的配置信息。例如MySQL, Redis, Memcached等的连接/主机信息。配置可能会在一天中随机更改。例如,当MySQL服务器从我们的数据库集群中添加或删除时。因此,在yml/xml中硬编码配置是不可能的。

所以我正在寻找一种方法来修改配置。应用程序启动时的Yml值。配置中的一些值将是静态的。例如Twig和Switfmailer的配置,但是Doctrine和Redis的其他值需要在飞行中设置。

在Symfony应用程序启动之前无法确定配置值,并且无法缓存或编译这些值。我尝试了一些方法来连接到引导过程并修改配置,但都不起作用。

附加信息

我正在处理的架构示例如下:http://aredko.blogspot.com/2013/10/coordination-and-service-discovery-with.html除了MySQL和Redis这样的服务,我们还需要发现我们自己的RESTful服务。Zookeeper被用作服务发现代理。服务的位置(主机名)和确切配置直到运行时/boot才知道。

我建议你看看OpenSkyRuntimeConfigBundle

bundle允许您用一些逻辑替换传统的容器参数(通常写入parameters.yml)。这为你提供了一种查询Zookeeper的方法来检查最新的配置变量,并将它们注入到Symfony2服务中,而无需重新构建容器。

由于您可以以任何可能的方式编写逻辑,您还可以为参数实现本地缓存。ZK读取性能很好,但总是需要网络往返。如果性能对您来说很重要,那么也可以在这里使用缓存。

如果你关心性能,我甚至不会考虑在没有缓存的情况下运行Symfony 2。

听起来你还没有完全确定构建基础设施的最佳方式,同时扩大/缩小规模。如果不了解更大的图景,很难具体说明,但是如何将Symfony 2db配置指向代理服务器,并在网络级别管理路由呢?然后应用程序保持幸福的不知道数据库服务器的搅动…