Quel est le meilleur moyen pour enregistrer les variables de configuration de PHP web app?
J'ai souvent basculer entre les deux .NET et de développement en PHP. Avec ASP.NET sites je enregistrer les informations de configuration (par exemple, les chaînes de connexion, répertoires, paramètre d'application) dans le web.config fichier est correctement protégé et facile d'accès, les valeurs, etc.
Dans PHP, je résoudre ce avec un classe qui a des méthodes statiques pour chaque variable:
class webconfig {
public static function defaultPageIdCode() {
return 'welcome';
}
}
Le fichier est inclus par l'application variables sont accessibles avec une seule ligne:
$dp = webconfig::defaultPageIdCode();
Et depuis PHP n'est pas compilé, il est facile de telnet et de modifier une valeur pour un site web de toute façon, cette solution fonctionne assez bien et me donne ces deux avantages:
- Je peux ajouter de la logique à une variable de config sans casser son interface avec l'application
- ces variables de configuration apparaissent comme intellisense dans mon ex: Eclipse, NetBeans, etc.
Mais je peux imaginer qu'il y a d'autres façons de résoudre économie de configuration web de paramètres en PHP qui peut avoir d'autres avantages.
En particulier ceux qui ont de l'expérience avec un certain nombre de frameworks PHP, ce sont d'autres façons de gagner variables de configuration et de leurs avantages et inconvénients?
- double possible de PHP, la Lecture de Fichiers - c'est au sujet de la lecture des fichiers de configuration dans différents formats. Si vous claque une classe en haut, qui prévoit explicitement une API pour les valeurs est à vous.
Vous devez vous connecter pour publier un commentaire.
J'ai décidé de liste de toutes les méthodes connues avec leurs avantages et inconvénients.
J'ai marqué cette réponse comme un wiki de la communauté afin de collaboration est plus facile.
Constantes Globales
Attribution:
define('CONFIG_DIRECTIVE', 'value');
Accès:
$object = new MyObject(CONFIG_DIRECTIVE);
Avantages:
Inconvénients:
Remarques:
Syntaxe Des Fichiers De
Par exemple: XML, INI, YAML, etc.
Attribution:
config_directive = value
.)Accès:
parse_ini_file()
.)Avantages:
Inconvénients:
Tableau
Attribution:
$config['directive'] = 'value';
Accès:
$object = new MyObject($config['directive']);
$container = new MyContainer($config);
Avantages:
Inconvénients:
Remarques:
Classe
Attribution:
myCfgObj::setDirective('DIRECTIVE', 'value');
myCfgObj->setDirective('DIRECTIVE', 'value');
Accès:
$object = new MyObject(myCfgObj::getDirective('DIRECTIVE'));
$object = new MyObject(myCfgObj->getDirective('DIRECTIVE'));
Avantages:
Inconvénients:
__DIR__
,__FILE__
, etdirname()
.J'ai tendance à utiliser un des Paramètres statiques de la classe en PHP, c'est parce que
Exemple:
Puis à l'intérieur de votre exécution, si vous le chargement de ce fichier en premier, suivi par votre base de données fichier de configuration de votre base de données fichier de config ressemblerait donc:
Comme vous pouvez le voir, nous avons une méthode
__get
qui ne devraient être autorisés à saisir les variables publiques, Un exemple de pourquoi nous avons ce est comme suit:Indépendamment du fait que nous avons utilisé cet objet comme un objet statique, les valeurs doivent encore se tenir dans le modèle, vous pouvez maintenant faire, laisse dire.
Et cela vous permettra seulement d'avoir accès aux données publiques au cours de la initialisée période.
Cela peut devenir beaucoup plus complexe, mais plus le système sympathique, quelques exemples:
loadConfig
méthode pour analyser automatiquement un fichier de configuration xml, php, yaml.shutdown_function
vous pouvez auto mise à jour de la base de données avec de nouveaux paramètres.Cela aussi m'est de loin l'une des meilleures méthodes pour mener à bien ce travail.
get($parameterName)
méthode bien que."Write less, Do more"
, La charge est très très mineur bien 🙂get
méthode, je préfère l'utiliser à la place des deuxgetProtected
etgetPublic
ceux. Ou ont-ils un but que je suis absent?__get
méthode ne sera probablement jamais être appelé comme c'est un résumé et classe statique (à moins que vous instanciez un enfant de laSettings
classe). Aussi, j'aimerais revenir unNULL
ou lever une exception si le code tente d'accéder à un unset valeur, commefalse
est une valeur valide qui peut être réglé pour un paramètre, alors que la valeur NULL signifie généralementundefined
.__get
est donc, si vous affectez un objet instancié à Vue alors que la vue peut seulement voir les variables publiques.La façon dont je le fais, c'est directement les stocker dans un
array
et enregistrez le fichier en tant que config.phpThi est la façon dont la plupart des frameworks PHP comme WordPress, etc faire.
web.config
$config['version'] = getDynamicVersion();
. Mais un autre avantage des méthodes statiques sont qu'ils pop up dans mon Eclipse intellisense.global $config;
partout où vous les utilisez et b) en raison de ce qu'ayant un nom générique, il peut être écrasé par erreur.$config
nom de n'importe quel nom que vous voulez$rev_config
pour éviter les conflits.$GLOBALS['config']
, mais c'est encore plus. Un autre inconvénient de ne pas mentionné, c'est qu'aucune IDE prend actuellement en charge autocompleting tableaux (alors que tous les support autocompleting définit, si vous savez comment ça commence).global $config;
ou$GLOBALS[]
. Il fait beaucoup plus de sens pour passer le nécessaire config directives directement ou de les transférer à un objet conteneur pour être transmis à l'interne.Remarque: "Meilleur moyen" n'existe jamais. Chaque application et du cadre de faire leur propre style. Bien que votre exemple est en fait le truc, je pense que c'est un peu voraces en ressources pour un simple fichier de configuration.
Edit:
Edward veuillez jeter un oeil à parse_ini_file exemples. Vous pouvez charger l' .ini fichier avec une commande simple, alors vous pouvez utiliser les variables dans une classe, comme dans votre exemple.
Il y a assez beaucoup de possibilités je pense, mais les plus courantes sont les méthodes de stockage sous forme de texte en clair dans les fichiers comme .csv, .ini, .xml. Avec le peu de trucs que vous pouvez protéger ces fichiers, de sorte que personne ne peut charger les fichiers directement.
un Fichier INI exemple:
La
;
est considéré comme un commentaire dans les fichiers ini. Ainsi, lorsque vous lisez le fichier avec une ini-analyseur, cette ligne sera ignoré. Si quelqu'un accède au fichier directement via l'url de ladie()
-fonction sera exécutée. Cela ne fonctionne que si le fichier INI porte une extension de fichier comme .php de façon à ce que le serveur sait que cela devrait être exécutées et non affichée sous forme de texte brut.Inconvénient de la plupart des fichiers de base-config-stockages sont des problèmes avec certains utf8-caractères.
Zend_Config est un composant du Zend-Framework, qui offre la possibilité pour le stockage de plusieurs adaptateurs avec un facile à utiliser l'api.
json
,xml
, etc. (qui ont intégré dans les parsers), sinon, envisager de clé/valeur de magasins (reddis, mongo), ou de la base de données soutenu de configuration.En PHP j'utilise toujours un ".htaccess" pour protéger mon fichier de config (Double protection)
Depuis PHP est capable d'utiliser OO, j'aime aller avec une "Config classe":
Il est facilement accessible avec Config::DB_DRIVER. Pas besoin d'inclure le fichier depuis l'application de l'autochargeur le fera pour vous. Bien sûr, de protéger le fichier doit encore être fait.
define
s, a les derniers inconvénient de ne pas être en mesure d'utiliser des tableaux de et a, il est unique inconvénient: il ne peut pas utiliser des expressions dans les affectations, comme'http://'.$_SERVER['HTTP_HOST'] . '/'
oudirname()
qui sont nécessaires les la plupart des cas.define
de ne pas polluer l'espace global.Telnet? OMG je suis tombé dans un timewarp et est arrivé en 1992!
Mais sérieusement, SI il y a des outils qui permettent asp.net (et autres langues) pour analyser les données de session, qui est juste un tableau associatif php sérialisé. J'aimerais avoir un aller à la mise en œuvre de l'paramètres globaux comme une sorte d'ombre de session en PHP. Même si vous ne stockez pas vos paramètres de configuration de sérialisé tableau PHP, vous pouvez mapper la session en cours au moment de l'exécution à l'aide de votre propre gestionnaire de session.
En termes de l'endroit où vous stockez les données - c'est un peu plus difficile quand vous êtes probablement en cours d'exécution sur une plate-forme Microsoft. Évidemment, vous ne voulez pas les frais d'accès au disque pour chaque demande. Bien que NT fait de la mise en cache du disque, il n'est pas (IME) tout à fait aussi efficace que d'autres OS. Memcached semble être une solution à ce problème. Il ne semblent être utilisable de asp.net.
HTH
La route habituelle est d'utiliser
define
:et d'accéder à tous les coins de l'application via
MYSQL_USER
:Cependant tableaux ne sont pas pris en charge dans cette voie.
Il y a plusieurs possibilités:
Vous pouvez utiliser le fichier de configuration (ini, json, xml ou yaml). Pour ini vous avez
parse_ini_file
, JSON, il estjson_decode
(+file_get_contents), pour YAML, vous devez utiliser une bibliothèque externe (recherche de sfYaml)Vous pouvez avoir un fichier de config avec des variables ou des constantes (plus immuable de config et accessible dans tous les domaines), qui vous inclut dans votre script:
define('ROOT_DIR', '\home\www");
$sRootDir = '\home\www";
Si vous êtes OO-orienté, vous pouvez l'envelopper dans la classe, en tant que propriétés - vous n'avez pas de méthode de lecture pour chaque propriété, vous pouvez juste avoir:
($c = new Configuration(); print $c->var1)
ou
(imprimé c::$var1)
Le mieux est d'avoir de registre de type de classe, la mise en œuvre de pattern singleton et capable de lire config à partir d'un fichier donné.
Pour être testable, j'utilise un
Config
classe qui détient le réel et les données de configuration d'unAppConfig
statique de la classe qui contient une référence à unConfig
objet chargés lors de l'amorçage de l'application de l'échelle de fichiers de configuration (dépendance injecté au bootstrap). Dans les tests de l'environnement, j'ai seulement changer laConfig
objet. Voir https://github.com/xprt64/Config