JeuWeb - Crée ton jeu par navigateur
Article Où mettre les variables de configuration - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Article Où mettre les variables de configuration (/showthread.php?tid=8223)



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
  • Aucun ?