Snippet #25 ~ PHP: Intégrez une base de donnée dans votre fichier unique d’exécution

Voila un ptit snippet que vous n’aurez l’occasion d’expérimenter que dans de très rares cas de figures mais qui révèle une particularité significatif du PHP, à savoir sa capacité à se réécrire lui même.

En effet le PHP étant un langage interprété la source du script peut être réécrite en cours d’exécution sans que cela pose le moindre problème.

C’est ce petit exercice que je vous propose avec ce snippet qui permet d’utiliser le fichier PHP en tant que sa propre base de données.

C’est à dire que la bas est stockée dans le fichier lui même sous forme compressée.

Dans cette exemple on utilise simplement le snippet pour lire sa base de donnée intégrée, l’afficher, et y sauvegarder un nouveau “hello world”
à chaque exécution de la page.

utilisation :
db() : retourne la base de donnée sous la forme d’un tableau php (lecture)
db($array) : remplis la base de donnée a partir d’un nouveau tableau php (écriture)

La base de données est stockée physiquement sous forme compressée dans la variable $database.

Les avantages :
– Ce type de snippet est très utilisé dans les scripts dit “mono fichiers” a savoir qui contiennent tout leurs code logiciel dans un seul fichier, ceci permet de rendre le script plus simple à installer/migrer.
– La base étant compressée à l’aide de gzinflate/deflate, elle peut contenir un grand nombre d’informations sans prendre trop de poids
– La base étant transportée sous forme de json est de tableau PHP, sa structure est dynamique (donc plus souple, mais c’est autant un inconvénient qu’un avantage si vous ne mettez pas en place certains garde fous).

Les inconvénients :
– il est nécessaire de garder la syntaxe exacte “$database = ”;” (avec les mêmes espaces etc…)
– La base étant compressée à l’aide de gzinflate/deflate, certains caractères spéciaux vont apparaitre dans la variables $database qui risquent de vous empêcher les copier/coller et/ou les modifications de fichiers avec certains encodages

<?php

//On ouvre la base de donnée sous forme de tableau
$db = db();
//on ajoute quelques données et on affiche la base
@$db['entries'][] = 'hello world '.count(@$db['entries']);
var_dump($db);
//on enregistre la base
db($db);

//A partir d'ici, ne touchez à rien ou tout explose.

//Base de donnée json compressée
$database = '';
//fonction de gestion de base de donnée intégrée
function db($d=false){
    $s = file_get_contents(__FILE__);
    if(!$d){
        preg_match_all('/\$database = \'(.*?)\';/s', $s, $result, PREG_PATTERN_ORDER);
        return $result[1][0]==''?array():json_decode(gzinflate($result[1][0]),true);
    }else{
        file_put_contents(__FILE__,preg_replace('/\$database = \'(.*?)\';/s', '$database = \''.gzdeflate(json_encode($d)).'\';', $s));
    }
}
?>

D’une manière générale cette façon de stocker les données ‘en intégré’ est déconseillée, il est préférable d’utiliser un vrai sgbd clairement distinct du code d’exécution.

Cependant dans le cas de programmes ayant besoin d’être léger en poids et en nombre, portable, et qui ne nécessitent pas de stocker un
trop grand nombre de données, ce petit snippet peut faire l’affaire.

8 réactions au sujet de « Snippet #25 ~ PHP: Intégrez une base de donnée dans votre fichier unique d’exécution »

  1. Yosko Réponse

    Sympa comme idée. Hop, coude.
    J’imagine que ça devient utile particulièrement dans le cas d’un script qui veut rester en un seul fichier (facilité d’installation et de backup).

  2. Bronco Réponse

    C’est précisément pour ce genre de choses que j’aime php… ya toujours moyen de bidouiller ! 😀
    Alors les puristes (ceux qui aiment la purée) vont hurler… ben oui, c’est pas forcément élégant, pas très habituel, peut-être pas sécurisé… MAIS C’EST POSSIBLE DE LE FAIRE ^^ oO

    Et puis, hé, ho, les puristes: vous allez me dire que vous n’avez jamais démarré des snippets juste pour voir si c’était possible ? pour la beauté du geste ?
    Haaaaaaaaaaaaaa…. vous voyez bien ! :siffle:

    Cette bidouille-là, j’y avais pas pensé: félicitations !

  3. cybwn Réponse

    Si le fichier PHP a les droits d’écriture sur lui même, ça sent déjà pas très bon niveau sécurité.

    • Idleman Auteur ArticleRéponse

      Soyons clair : la sécurité voir même la stabilité n’est pas le fort de ce snippet, c’est un bout de code a utiliser que dans certaines conditions très précises et avec la plus extrême prudence 🙂

  4. katsuo49 Réponse

    Franchement je trouve ça trop incroyable comme idée ! oO
    Mais c’est géniale, j’ai beau avoir fait pas mal de PHP j’y avais jamais pensé x)

  5. jerry wham Réponse

    Pas mal.
    Pour rendre ça un peu plus “sécure”, il suffit de déporter la base dans un fichier distinct et le tour est joué. 😀

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.