Les options que je vois avec des avantages / faiblesses relatifs sont:
Mécanismes basés sur des fichiers
Ceux-ci nécessitent que votre code recherche dans des emplacements spécifiques pour trouver le fichier ini. C'est un problème difficile à résoudre et qui revient toujours dans les grandes applications PHP. Cependant, vous devrez probablement résoudre le problème afin de trouver le code PHP qui sera incorporé / réutilisé au moment de l'exécution.
Les approches courantes pour cela sont de toujours utiliser des répertoires relatifs, ou de rechercher à partir du répertoire courant vers le haut pour trouver un fichier nommé exclusivement dans le répertoire de base de l'application.
Les formats de fichiers courants 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 à partir du cache d'opcode - ce qui donne un avantage en termes de performances.
Le include_path fournit un moyen pour extraire 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. Il fournit une route 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'y a pas de fonction standard pour échapper les données à intégrer dans le code PHP comme cela existe pour le HTML, les URL, les instructions MySQL, les commandes shell ... .
Données sérialisées
Ceci 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. Il nécessite très peu de code pour créer / analyser le fichier de données (vous pouvez donc à la place 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 appeler du code simplement en lisant le fichier de configuration (la méthode magique __wakeup).
Fichier structuré
Le stocker en tant que fichier INI comme suggéré par Marcel ou JSON ou XML fournit également une simple api pour mapper le fichier dans une structure de données PHP (et à l'exception de XML, pour échapper aux données et créer le fichier) tout en éliminant l'invocation du code vulnérabilité utilisant des données PHP sérialisées.
Il aura des caractéristiques de performance similaires aux données sérialisées.
Stockage de base de données
Ceci est mieux pris en compte lorsque vous avez une énorme quantité de configuration mais que vous êtes sélectif dans ce qui est nécessaire pour la tâche actuelle - j'ai été surpris de constater qu'à environ 150 éléments de données, il était plus rapide de récupérer les données d'une instance MySQL locale que de désérialiser un fichier de données.
OTOH 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 l' environnement d'exécution dans lequel PHP s'exécute.
Cela supprime toute exigence pour le code PHP de chercher dans un endroit spécifique pour la configuration. OTOH, il ne s'adapte pas bien à de grandes quantités de données et est difficile à changer 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 signifie que cela ne s'adapte pas bien à de grandes quantités de configuration. Et puisque l'utilisateur final a le contrôle sur les données, elles doivent être stockées dans un format où toute falsification est détectable (c'est-à-dire avec une signature cryptographique) et ne doit contenir aucune information qui est compromise par leur divulgation (c'est-à-dire cryptée de manière réversible).
Inversement, cela présente de nombreux avantages pour stocker des informations sensibles appartenant à l'utilisateur final - si vous ne les stockez pas sur le serveur, elles ne peuvent pas être volées à partir de là.
Répertoires réseau
Un autre endroit intéressant pour stocker les informations de configuration est DNS / LDAP. Cela fonctionnera pour un petit nombre de petites informations - 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. Cela 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 contrôlée par version - par conséquent, obtenir la configuration directement à partir de votre système VC est une solution viable. Mais cela s'accompagne souvent d'une surcharge de performances significative, d'où la mise en cache peut être souhaitable.