2010-05-13 22 views
0

所有,PHP-如何根據屬性選擇XML部分?

我有以下格式的配置XML文件:

<?xml version="1.0"?> 
<configdata> 
    <development> 
     <siteTitle>You are doing Development</siteTitle> 
    </development> 
    <test extends="development"> 
     <siteTitle>You are doing Testing</siteTitle> 
    </test> 
    <production extends="development"> 
     <siteTitle>You are in Production</siteTitle> 
    </production> 
</configdata> 

要讀取這個配置文件應用環境設置,目前我使用的,在index.php文件下面的代碼:

$appEnvironment = "production"; 
$config = new Zend_Config_Xml('/config/settings.xml', $appEnvironment); 

要在多個環境中部署此代碼,因爲用戶必須更改index.php文件。而不是這樣做,是否有可能在xml文件中保留一個屬性,「say active = true」。基於哪個Zend_Config_Xml會知道要讀取哪些xml文件設置部分?

回答

2

如果您使用的是Zend Framework,我強烈建議您只使用在Zend Application的默認index.php中定義的APPLICATION_ENV常量。如果你不是,你可以這樣做。

// Define application environment 
defined('APPLICATION_ENV') 
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production')); 

它對應於你的環境變量在您的網站的.htaccess文件中設置:

//.htaccess 
SetEnv APPLICATION_ENV development 

然後,您可以加載您的配置文件,如下所示:

$config = new Zend_Config_Xml('/config/settings.xml', APPLICATION_ENV); 

然後切換環境,所有需要做的事情就是在.htaccess文件中切換值。在我的服務器上,我已將自己的部署腳本設置爲根據要部署的環境自動切換值:

$ sed -i 's/development/production/' /path/to/site/root/.htaccess 
1

相反,您可以擁有一個用於開發的獨特引導文件和一個用於生產的獨特引導文件。

  • index.php.production
  • index.php.development

這兩個文件可以是源控制之下。部署腳本會將相應的引導程序複製到index.php中,然後離開。 index.php文件可以並且應該被源代碼控制忽略 - 否則你只是踩着腳趾。

當然,專門的引導程序文件將包含適當的環境字符串。

1

有幾種方法可以解決這個問題,最簡單的方法是setting the application environment constant in your vhost file

如果您無權訪問vhost文件(例如,共享主機),則可以將單獨的配置文件放置在所有環境中可用的服務器上的某個位置。

您可以將server.xml放在/ home/username(選擇一個可在您的所有環境中使用的目錄)。

server.xml中可能看起來像

<?xml version="1.0"?> 
<configdata> 
    <properties> 
     <environment>production</environment> 
    </properties> 
</configdata> 

負載server.xml中,你會任何其他配置文件

$server = new Zend_Config_Xml('/home/username/server.xml', 'properties'); 

最後,你可以加載在多個環境下的配置文件,而無需修改任何東西在你的應用程

$config = new Zend_Config_Xml('/config/settings.xml', $server->environment); 

的一個疑難雜症這裏是你必須確保你的server.xml文件放在部署您的應用程序之前。