Les options que je vois avec des mérites / faiblesses relatifs sont :
Mécanismes basés sur les fichiers
Ceux-ci exigent que votre code cherche le fichier ini à des endroits spécifiques. Il s'agit d'un problème difficile à résoudre, qui se pose toujours dans les grandes applications PHP. Cependant, vous devrez probablement résoudre ce problème afin de trouver le code PHP qui est incorporé/réutilisé lors de l'exécution.
Les approches courantes consistent à toujours utiliser des répertoires relatifs, ou à effectuer une recherche à partir du répertoire actuel vers le haut pour trouver un fichier dont le nom est exclusif au répertoire de base de l'application.
Les formats de fichiers couramment utilisés pour les fichiers de configuration sont le code PHP, les fichiers au format ini, JSON, XML, YAML et PHP sérialisé.
Code PHP
Cela offre une grande flexibilité pour représenter différentes structures de données et (en supposant qu'il soit traité via include ou require) le code analysé sera disponible dans le cache opcode, ce qui offre un avantage en termes de performances.
El include_path fournit un moyen d'abstraire les emplacements potentiels du fichier sans s'appuyer sur du code supplémentaire.
D'autre part, l'une des principales raisons de séparer la configuration du code est de séparer les responsabilités. Elle fournit une voie pour injecter du code supplémentaire dans le runtime.
Si la configuration est créée à partir d'un outil, il peut être possible de valider les données dans l'outil, mais il n'existe pas de fonction standard pour échapper les données pour les intégrer dans le code PHP comme cela existe pour le HTML, les URL, les déclarations MySQL, les commandes shell.....
Données sérialisées Cette méthode est relativement efficace pour de petites quantités de configuration (jusqu'à environ 200 éléments) et permet d'utiliser n'importe quelle structure de données PHP. Elle nécessite très peu de code pour créer/parser le fichier de données (vous pouvez donc consacrer vos efforts à vous assurer que le fichier n'est écrit qu'avec l'autorisation appropriée).
L'échappement du contenu écrit dans le fichier est géré automatiquement.
Puisque vous pouvez sérialiser des objets, cela crée une opportunité pour invoquer du code simplement en lisant le fichier de configuration (la méthode magique __wakeup).
Fichier structuré
Le stockage dans un fichier INI, comme suggéré par Marcel, ou JSON ou XML, fournit également une interface simple pour convertir le fichier en une structure de données PHP (et, à l'exception de XML, pour échapper les données et créer le fichier) tout en éliminant la vulnérabilité de l'invocation de code en utilisant des données PHP sérialisées.
Il aura des caractéristiques de performance similaires à celles des données sérialisées.
Stockage des bases de données
Il est préférable d'envisager cette solution lorsque vous disposez d'un grand nombre de configurations, mais que vous êtes sélectif dans ce qui est nécessaire pour la tâche en cours. J'ai été surpris de constater qu'à partir d'environ 150 éléments de données, il était plus rapide de récupérer les données à partir d'une instance MySQL locale que de désérialiser un fichier de données.
En revanche, ce n'est pas un bon endroit pour stocker les informations d'identification que vous utilisez pour vous connecter à votre base de données !
L'environnement d'exécution
Vous pouvez définir des valeurs dans le environnement d'exécution PHP est exécuté dans.
Cela supprime toute obligation pour le code PHP de rechercher la configuration à un endroit spécifique. En revanche, elle n'est pas adaptée à de grandes quantités de données et il est difficile de la modifier universellement au moment de l'exécution.
Sur le client
Un endroit que je n'ai pas mentionné pour stocker les données de configuration est le client. Là encore, la surcharge du réseau fait que cette solution n'est pas adaptée à de grandes quantités de configuration. Et puisque l'utilisateur final a le contrôle des données, celles-ci doivent être stockées dans un format où toute altération est détectable (c'est-à-dire avec une signature cryptographique) et ne doivent pas contenir d'informations compromises par leur divulgation (c'est-à-dire cryptées de manière réversible).
Inversement, cela présente de nombreux avantages pour le stockage d'informations sensibles appartenant à l'utilisateur final : si vous ne les stockez pas sur le serveur, elles ne peuvent pas être volées.
Annuaires de réseaux Un autre endroit intéressant pour stocker les informations de configuration est le DNS / LDAP. Cela fonctionnera pour un petit nombre de petits éléments d'information - mais vous n'avez pas besoin de vous en tenir à la 1ère forme normale - considérez par exemple SPF .
L'infrastructure prend en charge la mise en cache, la réplication et la distribution. Elle fonctionne donc bien pour les très grandes infrastructures.
Systèmes de contrôle de version
La configuration, tout comme le code, doit être gérée et faire l'objet d'un contrôle de version. Obtenir la configuration directement à partir de votre système VC est donc une solution viable. Mais cela s'accompagne souvent d'un surcoût important en termes de performances, d'où l'intérêt de la mise en cache.