Où mettre les variables de configuration

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 ?


 
tutoprog/ou_mettre_les_variables_de_configuration.txt · Dernière modification: 2011/04/03 14:06 (édition externe)