2016-01-05 67 views
2

在配置文件我已经存储地址到服务器我的网站依靠。Zend框架2 - 写入配置文件

如果此服务器发生故障,我想使用备份服务器。 (永久性的,不仅仅是这个请求)。所以如果server1失败,我想使用server2。

我发现在我的配置文件中更改地址的最佳方法。但正如我所知Zend Framework 2不能写入配置文件。

任何想法?

+1

“服务器故障”是什么意思。如果失败,您是否仍然能够读取服务器上配置的变量?将重定向逻辑存储在“失败”时需要重定向的服务器的应用程序配置中似乎是不合逻辑的...... – Wilt

+0

这2个服务器来自外部提供商。我用它们来存储多媒体内容。有时候,其中一台服务器出现故障,或者请求开始超时。这些服务器的管理员需要一段时间才能修复它....我不希望我的用户等待(每次请求)server1超时,然后使用server2 ...我想存储到一些永久存储,该服务器1失败,所以我的网站在修复之前使用服务器2。 –

+1

在这种情况下,您应该也可以考虑使用排队服务,以便用户不必等待。当使用排队服务时,服务器将在向客户端返回响应之后处理作业。 – Wilt

回答

0

但据我所知Zend Framework 2无法写入配置文件。

是的,它可以。它有整个Zend\Config\Writer组件。如果使用的是默认的PHP阵列的配置文件,您可以更改配置文件是这样的:

$path = 'config/autoload/local.php'; 
$config = include $path; 
$config['key'] = 'new value'; 

$writer = new \Zend\Config\Writer\PhpArray(); 
$writer->toFile($path, $config); 

不要忘记删除配置的缓存,如果你正在使用一个。

但我认为有更好的方法来做到这一点 - 而不是改变配置文件,你可以为每个服务器准备配置模板,并轻松地交换它们。因此,在config/autoload目录中,您将拥有包含您需要的每个服务器的地址配置的文件adresses.local.server1.php.distadresses.local.php.dist。然后,如果你需要使用配置server1的,只是把它复制:

$ cp adresses.local.server1.php.dist adresses.local.php 
+0

配置文件应该用于静态变量。在阅读和使用它之前,使用作者来更改变量似乎是不合逻辑的。 – Wilt

+0

@我同意。这就是为什么我提供另一种解决方案 – lku

0

配置文件应该只用于静态变量。

要实现这一点,最好将服务器返回给服务器。例如一个ServerAddressProvider

$service = $serviceManager->get('Application\Service\ServerAddressProvider'); 
$address = $service->getServerAddress(); 

在您的服务中,您可以添加自定义逻辑,以返回正确的服务器地址。

在服务器内部,您可以在返回地址之前ping服务器,以检查它是否在线,并在服务器暂时不可用时返回替代(备份)服务器。

+0

感谢您的解决方案。你的意思是在每次请求之前ping服务器吗?那会给我额外的延迟。如果服务器出现故障,我将不得不等待ping超时......不是吗? –

+0

你还知道服务器是否在线/离线?你目前的解决方案如何做到这一点。关于额外的延迟,这就是为什么我建议在[我的评论]中实现排队服务的原因(http://stackoverflow.com/questions/34617436/zend-framework-2-write-to-config-file/34651912#comment57049040_34617436) 。您的客户不应该等待您的服务器处理存储您的多媒体内容。 – Wilt