Gérer plusieurs niveaux de configuration de vos sites en PHP de façon simple

Si on bosse proprement quand on fait un site Internet, on a forcément un environnement de développement et un environnement de production séparés. Idéalement on en a aussi entre les deux pour les testeurs.

Dans la plupart des sites Internet on a un ensemble de paramètres par défaut et des personnalisations elon l'ordinateur, le développeur ou le nom de domaine. L'avantage c'est que PHP nous permet de faire ça très simplement.

Idéalement, afin d'éviter d'écraser la configuration de production avec celle de vos développeurs, les informations de chaque devraient être stockées dans des fichiers différents. Que vous passiez par des constantes ou des variables peu importe. On peut tout mélanger à plusieurs niveaux et faire ça assez proprement en un minimum de code.

Exemple ici avec ce que j'ai utilisé sur le projet CCTRB pour la configuration de la base de données :

if (("127.0.0.1" == $_SERVER["SERVER_ADDR"]) || ("::1" == $_SERVER["SERVER_ADDR"])) {
	require_once(__DIR__."/config-dev.inc.php");
}
else {
	require_once(__DIR__."/config-prod.inc.php");
}

On a deux fichiers contenant les mêmes define() mais avec des noms différents. Le fichier de configuration de la base de production est bien entendu filtré pour ne pas atterrir sur le dépôt de code public.

Autre exemple avec la configuration du projet RezEmploi :

if (("127.0.0.1" == $_SERVER["SERVER_ADDR"]) || ("::1" == $_SERVER["SERVER_ADDR"])) {
    /* accès en local (dev, test) */
    @include_once(__DIR__ . "/config-dev.inc.php");
} else {
    /* accès sur serveur (production) */
    @include_once(__DIR__ . "/config-prod.inc.php");
}
require_once(__DIR__ . "/config-dist.inc.php");

Ici j'ai un fichier de personnalisation pour l'environnement de développement (en localhost), un fichier de personnalisation pour l'environnement de production et le fichier qui contient l'intégralité des paramètres de configuration avec leurs valeurs par défaut.

Si quelque chose est personnalisé dans config-dev.inc.php ou config-prod.inc.php il ne sera pas écrasé par config-dist.inc.php mais pour le reste tout s'y trouve.

Le fichier config-dev.inc.php contient également une constante permettant d'activer le mode débogage du site avec ce simple define():

define("DB_HOST", "localhost");
define("DB_NAME", "rezemploi");
define("DB_USER", "rezemploi");
define("DB_PASS", "XXXXXXXXXX");
define("_TitreDuSite", "DevRezEmploi");
define("_URLDuSite", "http://localhost/RezEmploi/src/www/");
define("_DEBUG", true);

Vous vous doutez bien que dans la configuration par défaut on a quelque chose de plus neutre :

// serveur de la base de données (localhost par exemple)
if (!defined("DB_HOST"))
    define("DB_HOST", "");

// nom de la base de données
if (!defined("DB_NAME"))
    define("DB_NAME", "");

// utilisateur de la base de données
if (!defined("DB_USER"))
    define("DB_USER", "");

// mot de passe de la base de données
if (!defined("DB_PASS"))
    define("DB_PASS", "");

// titre du site (utilisé en TITLE du header)
if (!defined("_TitreDuSite"))
    define("_TitreDuSite", "");

// URL du site (penser au "/" final)
if (!defined("_URLDuSite"))
    define("_URLDuSite", "");

// mode débogage du site activé ?
if (!defined("_DEBUG"))
    define("_DEBUG", false);

Il ne reste à l'intégrateur ou au webmaster faisant la mise en production qu'à lister les paramètres de distribution, changer ceux qui l'intéressent et ne pas tenir compte des autres.

Dans mon cas je teste généralement l'IP locale et "autre IP" car je travaille en local sur mes ordinateurs ou machines virtuelles. Ca permet aussi de changer l'hébergement du site sans se préoccuper d'y changer quoi que ce soit (à part les identifiants d'accès aux bases de données qui peuvent changer).

Dans vos cas, comme PHP reçoit toutes les informations de la requête vous pouvez tester le domaine appelé, l'IP du client (pas une bonne idée, mais à vous de voir) ou de destination (celle du serveur) et ajouter un ensemble de fichiers éventuellement sur plus de niveaux même si ça compliquera le débogage et la configuration ensuite.