Definiamo una variabile di ambiente (ENVPHP) e la usiamo nei nostri file di configurazione XML, quindi i parametri DB corretti vengono caricati finché si definisce la variabile di ambiente ENVPHP corretta. Usando XML puoi estendere (o scavalcare) i tuoi parametri comuni con quelli per gli specifici ambienti.
ie. la configurazione si presenta come segue:
<?xml version="1.0" encoding="UTF-8"?>
<application>
<common>
<name>MyApp_name</name>
<code>MyApp_code</code>
<version>MyApp_version</version>
<authentication>
... authentication specific parameters (ie. LDAP connection parameters)
</authentication>
...
</common>
<dev extends="common">
<database>
... DB connection parameters for development
</database>
...
</dev>
<tst extends="common">
<database>
... DB connection parameters for test
</database>
...
</tst>
<prd extends="common">
<database>
... DB connection parameters for production
</database>
...
</prd>
</application>
E per caricare la configurazione, ho il seguente nel mio bootstrap (beh, in realtà in una classe Singleton Application):
public static function getEnv()
{
if (self::$env === null) {
self::$env = getenv('ENVPHP');
} else {
return self::$env;
}
}
protected function initConfig()
{
$configFile = $this->appDir . '/config/application.xml';
if (! is_readable($configFile)) {
throw new Application_Exception('Config file "' . $configFile . '" is not readable');
}
if (false === self::getEnv()) {
throw new Application_Exception('The environment variable "ENVPHP" is not defined');
}
$config = new Zend_Config_Xml($configFile, self::getEnv(), true);
$config->setReadOnly();
Zend_Registry::set('config', $config);
$this->config = $config;
}
Nel codice PHP se voglio per fare alcune cose solo per ambienti specifici, quindi uso Application :: getEnv() per verificare quale ambiente sono dentro ed eseguire il codice che voglio in base ad esso.
BTW La variabile di ambiente ENVPHP può essere impostata nel file di configurazione Apache utilizzando ie. SetEnv ENVPHP "dev"
all'interno del contenitore VirtualHost. Per gli script CLI PHP si dovrebbe impostare come una variabile d'ambiente OS ...
SetEnvIf Host def.example.com APPLICATION_ENV = staging funziona per me – Yeroon
modo migliore sembra essere: SetEnvIf HOST^abc.example.com $ APPLICATION_ENV = produzione ... – Kamil