Où mettre les variables de configuration - Xenos - 14-09-2020
Où mettre les variables de configuration
Souvent dans un jeu, on peut vouloir stocker des éléments de configuration constants. Les identifiants d'accès à la base de données, le nombre de joueurs maximum par univers, le nombre d'invitation que le joueur peut envoyer à des amis, etc.
Passons en revue quelques moyens de stocker ces informations ainsi que les avantages et inconvénients de chacun.
Les exemples de codes sont données pour PHP.
Tableau déclaré à même le code source
Cette solution consiste à créer directement un tableau associatif dans le code source de l'application.
$configuration = array(
'players_per_universe' => 50,
'supported_languages' => array('EN', 'FR'),
'database' => array(
'username' => 'root',
'password' => 'jambon fumé',
'host' => 'localhost',
'database' => 'my_game'
)
);
Avantages- Cette solution est la plus performante ;
- C'est la solution la plus simple ;
Inconvénients- C'est sale : il y a des risques de conflits de nommage si une variable $configuration existe ;
- C'est peu flexible : si vous utilisez des scripts externes(des tâches automatisées, par exemple), elles ne pourront pas utiliser ces éléments.
- Il faut modifier le code source pour reporter un changement, il est difficile de faire une interface pour gérer ça plus simplement.
Tableau retourné par un fichier inclus
Cela consiste à retourner un tableau associatif depuis un script PHP inclus.
Fichier configuration.include.php :
return array(
'players_per_universe' => 50,
'supported_languages' => array('EN', 'FR'),
'database' => array(
'username' => 'root',
'password' => 'jambon fumé',
'host' => 'localhost',
'database' => 'my_game'
)
);
Dans le code source d'application, on peut écrire :
$configuration = include('configuration.include.php');
Avantages- Cette solution est très performante ;
- Contrairement à la solution précédente, on maîtrise le nommage de la variable, on diminue le risque de conflit ;
- On peut utiliser le même fichier de configuration pour des scripts externes en PHP ;
Inconvénients- Les scripts externes qui incluent ce fichier doivent être des scripts PHP ;
- Il faut modifier le code source pour reporter un changement, il est difficile de faire une interface pour gérer ça plus simplement.
Utiliser la base de données
Cette solution consiste à créer une table (par exemple “configuration_items”) contenant trois colonnes : un espace de nom, une clé et une valeur.
Avantages- Simple à utiliser ;
- Il est facile de créer une interface pour administrer ces variables ;
Inconvénients- Cette solution est moins performante dans le cas où la connexion à la base (coûteuse en ressources) n'est ouverte que pour récupérer des éléments de configuration ;
- On ne peut pas y stocker les informations de connexion à la base de données puisqu'il est justement nécessaire de se connecter pour récupérer les éléments de configuration ;
- On ne peut stocker que des variables scalaires en guise de valeurs.
Remarques
Cette solution est utile dans un script amené à être utilisé par d'autres personnes qui n'ont pas forcément de compétences en informatique (pour un CMS, par exemple).
Utiliser un fichier INI
Cette solution consiste à créer un fichier INI (http://fr.wikipedia.org/wiki/Fichier_INI). Ces fichiers sont de simples fichiers texte écrit en respectant une syntaxe particulière.
Fichier configuration.ini :
[global]
players_per_universe = 50
supported_languages[] = "EN"
supported_languages[] = "FR"
[database]
username = "root"
password = "jambon fumé"
host = "localhost"
database = "my_game"
Dans le code source PHP :
// Ce fichier ne doit surtout pas être présent dans le dossier public_html/ sous peine d'être accessible à tous !
// Le deuxième argument permet de retourner un tableau à plusieurs dimensions.
$configuration = parse_ini_file('../configuration.ini', true);
Avantages- Cette solution est performante car la fonction d'interprétation est native à PHP ;
- On maîtrise le nommage (pas de conflit de noms à craindre) ;
- Ce fichier est lisible depuis n'importe quel langage ;
Inconvénients- La conversion d'un tableau PHP en fichier INI n'est pas triviale ;
- Le fichier ne peut avoir qu'un seul niveau de profondeur ;
Utiliser un fichier XML
Cette solution consiste à créer un fichier XML (http://fr.wikipedia.org/wiki/XML).
Fichier configuration.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<configuration_items>
<configuration_item>
<key>players_per_universe</key>
<value>50</value>
</configuration_item>
<configuration_item>
<key>players_per_universe</key>
<values>
<value>EN</value>
<value>FR</value>
</values>
</configuration_item>
</configuration_items>
<namespace name="database">
<configuration_items>
<configuration_item>
<key>username</key>
<value>root</value>
</configuration_item>
<configuration_item>
<key>password</key>
<value>jambon fumé</value>
</configuration_item>
<configuration_item>
<key>host</key>
<value>localhost</value>
</configuration_item>
<configuration_item>
<key>database</key>
<value>my_game</value>
</configuration_item>
</configuration_items>
</namespace>
</configuration>
Dans le code source PHP :
function xml2array($filename) {
$ret = array();
# Une fermeture avec PHP >= 5.3
$toArray = function ($elt, &$ret) {
foreach ($elt->configuration_items->configuration_item as $item) {
if (isset($item->values)) {
$ret[(string) $item->key] = array();
foreach ($item->values->value as $value) {
array_push($ret[(string) $item->key], (string) $value);
}
} else if (isset($item->value)) {
$ret[(string) $item->key] = (string) $item->value;
}
}
};
# Une lambda pour PHP < 5.3
/*$toArray = create_function('$elt, &$ret', '
foreach ($elt->configuration_items->configuration_item as $item) {
if (isset($item->values)) {
$ret[(string) $item->key] = array();
foreach ($item->values->value as $value) {
array_push($ret[(string) $item->key], (string) $value);
}
} else if (isset($item->value)) {
$ret[(string) $item->key] = (string) $item->value;
}
}
');*/
# (sinon utiliser une classe et en faire une méthode privée)
# /!\ Les chaînes (clés et valeurs) sont en UTF-8 !
libxml_use_internal_errors(TRUE);
$sxml = simplexml_load_file($filename);
if ($sxml) {
if (isset($sxml->configuration_items)) {
$toArray($sxml, $ret);
}
foreach ($sxml->namespace as $namespace) {
$key = (string) $namespace['name'];
$ret[$key] = array();
$toArray($namespace, $ret[$key]);
}
}
return $ret;
}
$configuration = xml2array('../configuration.xml');
Avantages- On maîtrise le nommage (pas de conflit de noms à craindre) ;
- Ce fichier est lisible depuis n'importe quel langage ;
- Convertir un tableau en chaîne XML est assez aisé, on peut donc créer une interface d'édition de la configuration ;
Inconvénients- Laborieux à interpréter ;
Utiliser un fichier JSON
Cette solution consiste à créer un fichier JSON (http://json.org/).
Fichier configuration.json :
{
players_per_universe: 50,
supported_languages: [ "EN", "FR" ],
database: {
username: "root",
password: "jambon fumé",
host: "localhost",
database: "my_game"
}
}
Dans le code source PHP :
// Ce fichier ne doit surtout pas être présent dans le dossier public_html/ sous peine d'être accessible à tous !
// Le deuxième argument permet de retourner un tableau associatif plutôt qu'un objet.
$configuration = json_decode(file_get_contents('../configuration.json'), true);
Avantages- Cette solution est performante car la fonction d'interprétation est native à PHP ;
- On maîtrise le nommage (pas de conflit de noms à craindre) ;
- Ce fichier est lisible depuis n'importe quel langage ;
- Le tableau peut-être converti en JSON avec json_encode(), il est donc très simple de créer une interface d'édition de la configuration ;
Inconvénients
|