mercredi, octobre 29 2008, 08:00
1 application = plusieurs environnements
Par Olivier Hoareau - Méthodologie - Lien permanent
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
- ...
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
2 commentaires
Hello, merci pour cet article.
Une petite alternative : personnellement je met un nom de domaine comme nom de sections pour mes fichiers .ini de configuration.
Coté applicatif je detecte le domaine utilisé et je charge la configuration correspondante.
Ca permet à la fois de gérer les environnements de développements différents et également de mettre des paramètres spécifiques à certains domaines (ex: locale par défaut fr_FR pour example.fr et en_Us pour example.com).
Pour info, pour gérer cette problématique dans symfony on a les outils suivants :
http://www.symfony-project.org/book...