Lorsqu'on nous développons nos applications PHP, nous sommes très souvent confrontés à plusieurs environnements d'exécution :

  • local (développement)
  • tests (build continue, ...)
  • intégration
  • recette
  • pré-production
  • production
  • ...

Bien souvent les paramétrages sont légèrement différents suivant les environnements notamment sur les points suivants :

  • type de base de données (ex: sqlite en développement, oracle en production)
  • serveur ou identifiants de connexion base de données (ex: root en développement, user restreint en production)
  • niveau de log et d'erreurs (ex: debug en développement, info en production)
  • système d'exploitation (ex: windows en développement, linux en production)
  • emplacements de fichiers et de l'application
  • ...

Une chose est sûre, la logique de votre application doit, elle, être identique sur tous ces environnements (sauf cas particulier...).

Comment faire ?

Voici une méthode simple qui permet de gérer le multi-environnements :

  • externaliser tous les paramétrages dépendants de l'environnement dans un fichier de configuration (ex: run.ini)
  • lister tous les environnements dans ce fichier (ex: dev, tests, preprod, prod), le fichier contient donc toutes les "versions" de paramétrages sous forme de section
  • réaliser un code d'initialisation de l'application qui se base sur une variable d'environnement (ex: PHP_ENV) pour détecter l'environnement sur lequel tourne l'application
  • lire le fichier de configuration à l'initialisation et récupérer les paramétrages spécifiques à la section d'environnement courante (ex: prod)
  • injecter ces paramétrages dans l'application.

Proposition d'implémentation avec Zend Framework

Voici comment implémenter cela avec le Zend Framework :

Fichier config/run.ini

[prod]

database.adapter=pdo_mysql
database.params.host=dbserver
database.params.dbname=dbprod
database.params.username=dbprod
database.params.password=XXxxxxX

logger.level=info

[test]

database.adapter=pdo_sqlite
database.params.host=
database.params.dbname=:memory:
database.params.username=
database.params.password=

logger.level = debug

[dev]

database.adapter=pdo_mysql
database.params.host=localhost
database.params.dbname=dbdev
database.params.username=root
database.params.password=

logger.level = debug

Fichier html/index.php (ou bien votre bootstrap, ou bien votre fichier commun à tous vos contextes) :

// ...
env = $_SERVER['PHP_ENV'];
Zend_Registry::set('config', new Zend_Config_Ini(dirname(__FILE__).'/../config/run.ini', $env));
// ...

Votre application peut alors utiliser la variable de registre Zend_Registry('config') pour récupérer toutes les informations concernant l'environnement dans lequel elle évolue (dev, test ou prod) Il vous suffit maintenant de définir la variable système PHP_ENV au niveau des serveurs de test, de production et en local. Typiquement vous pouvez soit positionner une variable d'environnement au niveau système, soit créer une variable d'environnement au niveau serveur web, sous Apache il suffit de faire :

PassEnv PHP_ENV

ou bien pour définir la variable uniquement à l'intérieur du serveur web :

SetEnv PHP_ENV prod