2016-01-05 85 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