2009-07-26 6 views
2

Je dois pouvoir stocker des données pour une application PHP dans un fichier. Je dois pouvoir faire ceci sans n'importe quelles dépendances externes autres que PHP lui-même.Stockage, mise à jour, récupération des paramètres pour une application PHP sans base de données

Voici les exigences que j'ai:

  • paramètres ne seront pas mis à jour/ajoutées/dissolue très souvent. La mise à jour des paramètres ne doit donc pas être très efficace. Cependant, je veux être capable de le faire tout au long d'un script PHP, pas à travers l'édition de fichiers.
  • Les paramètres seront lus en permanence, de sorte que la lecture des paramètres doit être très efficace.
  • Les paramètres sont dans un format unique, si je les avais dans un tableau, il pourrait être quelque chose comme $ Settings ["Database"] ["AccessSettings"] ["Username"] ["myDBUsername"];
    $ Paramètres ["Base de données"] ["AccessSettings"] ["Mot de passe"] ["myDBPassword"];

Je préférerais ne pas avoir les paramètres stockés dans des tableaux comme je l'ai mentionné ci-dessus. Au lieu de cela, je préférerais certaines méthodes d'accès: getConfig ("Database", "Accesssettings", "Username") retournerait "myDBUsername". La raison en est que je veux limiter les variables que je stocke dans la portée globale.

Quel serait le meilleur moyen d'obtenir/récupérer ces derniers? Faire la hiérarchie Je pensais peut-être un fichier xml, mais je ne savais pas à quoi ressemblait PHP pour accéder aux fichiers xml (en particulier le fait que je devrais pouvoir ajouter, modifier et supprimer). Si ce devrait être XML quel type d'accès xml dois-je regarder.

Si c'est un autre format, je voudrais que certains pointeurs vers la bonne direction pour ce qu'il faut regarder dans la façon d'utiliser ce format.

+1

Celui-ci sera intéressant. –

+1

S'il vous plaît voir ma réponse mise à jour ci-dessous. – hobodave

Répondre

3

Brian, parse_ini_file est ce dont vous avez besoin.

Ah, j'ai manqué l'exigence que vous éditiez ceci via PHP.

Dans ce cas, il n'y a rien de natif à PHP que vous pouvez utiliser à cette fin. Vous devriez rouler le vôtre.

Vous pouvez vous économiser un tonne de temps en utilisant simplement Zend_Config_Ini cependant. Je sais que vous déclarez que vous ne voulez pas utiliser autre chose, mais Zend Framework est structuré pour vous permettre d'utiliser les éléments dont vous avez besoin. Zend_Config peut être utilisé seul. Vous pouvez certainement ajouter ces quelques classes à votre projet et les laisser gérer votre analyse de fichier INI.

Voici un exemple d'utilisation au-dessus de vos échantillons:

[config] 
Database.AccessSettings.Username = myDBUsername 
Database.AccessSettings.Password = myDBPassword 

Vous chargerait et accéder à ce aussi simple que:

$config = new Zend_Config_Ini('/path/to/ini', 'config'); 
echo $config->Datbase->AccessSettings->Username; // prints "myDBUsername" 
echo $config->Datbase->AccessSettings->Password; // prints "myDBPassword" 

Pour modifier et enregistrer votre config que vous utilisez ce qui suit:

$config->Database->AccessSettings->Password = "foobar"; 
$writer = new Zend_Config_Writer_Ini(array('config' => $config, 
              'filename' => 'config.ini')); 
$writer->write(); 

Modifier

Je ne sais pas vraiment pourquoi les gens votent en bas sur les commentaires erronés de vog. Il est très simple de rendre ceci inscriptible par plusieurs personnes en utilisant un verrou exclusif. Zend_Config_Writer utilise file_put_contents pour faire son écriture, qui a toujours supporté l'indicateur LOCK_EX, qui verrouille exclusivement un fichier pour l'écriture. Lorsque vous utilisez ce drapeau, plusieurs graveurs ne peuvent pas tenter de mettre à jour le fichier en même temps.

Pour utiliser ce drapeau avec Zend_Config_Writer il est aussi simple comme suit:

$writer = new Zend_Config_Writer_Ini(array('config' => $config, 
              'filename' => 'config.ini')); 
$writer->setExclusiveLock(true); 
$writer->write(); 

Une autre syntaxe:

$writer = new Zend_Config_Writer_Ini(); 
$writer->write('config.ini', $config, true); // 3rd parameter is $exclusiveLock 
+0

Cela échouera horriblement sur l'accès parallèle par plusieurs clients Web. – vog

+0

@vog: c'est pour ça que la mise en cache est faite. – hobodave

+0

En outre, il est supposé que * tout * site de production PHP utilise un type de cache bytecode qui fournit un cache utilisateur, tel que APC. – hobodave

0

Si vous ne modifiez pas manuellement, utilisez des données sérialisées.

config écriture en utilisant serialize:

file_put_contents('myConfig.txt', serialize($Settings)); 

Lecture config en utilisant unserialize:

$Settings = unserialize(file_get_contents('myConfig.txt')); 

Vous pouvez écrire une classe pour modifier et d'obtenir des valeurs pour ces données en utilisant PHP fonctions magiques __get() et __set().

+0

Cela va horriblement échouer sur l'accès parallèle par plusieurs clients. – vog

+0

Veuillez clarifier, bien sûr vous auriez des collisions avec plusieurs setters, mais il n'y aurait pas de problème avec plusieurs lecteurs. L'auteur de la question dit: «Les paramètres ne seront pas mis à jour/ajoutés/supprimés très souvent, donc la mise à jour des paramètres ne doit pas être très efficace, mais je veux pouvoir le faire tout au long d'un script PHP. de fichiers. " –

+0

@Crad: Je souhaite que nous puissions voter pour les commentaires. – hobodave

0

Si vous êtes prêt à déposer dans une bibliothèque, vous pouvez utiliser Spyc et ont votre configuration dans un fichier YAML.

Vous pouvez également utiliser PHP's support for SQLite, ce qui signifie que votre base de données n'est qu'un fichier, donc pas besoin de serveur DB.

Questions connexes