[PHP] Mise en cache d'un tableau de données SQL

Pour faire suite à mon billet sur l'optimisation PHP/SQL d'un site web, voici une méthode pour mettre en cache des données issues d'une requête SQL de type SELECT.

Php propose deux fonctions aussi puissantes qu'utiles (mais aussi méconnues) : serialize et unserialize.

  • Serialialize compresse (linéarise) un tableau Php
  • Unserialize le décompresse (ou délinéarise), tout simplement.

A partir de là, l'idée paraît s'imposer d'elle même : pour certaines requêtes qui sont énormément exécutées et/ou qui sont très lourdes (par exemple les données d'un membre utilisées sur toutes les pages d'un site), pourquoi ne pas mettre en cache le tableau issu d'un mysql_fetch_array() ? Ainsi, une fois que la requête a été exécuté on n'accède plus à la base de donnée, on récupère le tableau de données dans un fichier texte puis on le décompresse.

La première fonction permet, tout simplement, d'écrire dans un fichier (en le créant, le cas échéant) :

<?
function maj_fichier($file,$valeur)
{
$fp = fopen("$file","w+"); // ouverture du fichier en écriture (on le créé s'il n'existe pas)
fputs($fp, $valeur); // on écrit dans le fichier
fclose($fp);
}
?>

La seconde - et c'est la fonction qui nous intéresse - est la fonction de mise en cache :

(pour l'utiliser vous aurez besoin de la fonction maj_fichier() ci-dessus et de la fonction requete_sql disponible sur ce billet)

<?
function MiseEnCache($nomFichier,$table,$where,$champs)
{

if(file_exists($nomFichier)) // si les variables sont en cache
{
$requete = unserialize(lire_fichier($nomFichier)); // on utilise le fichier cache (unserialize = decompresser le tableau)
}
else // sinon on fait la requete sql
{
$requete = requete_sql($table, $champs, $where);
maj_fichier($nomFichier, serialize($requete)); // on place le resultat du tableau dans un fichier (serialize = compresser le tableau)
}

return $requete;
}
?>

Exemple d'utilisation :

<?
$req_membre=MiseEnCache("/cache/membres/membre-".$id_membre.".txt","membres", "id='$id_membre'", "prenom,nom,date_inscription,login");

echo"Bienvenue ".$req_membre[prenom]." ".$req_membre[nom]." !";
?>

Cet exemple permet de pouvoir afficher sur toutes les pages le prénom et le nom du membre en effectuant la requête qu'une seule fois ! Malin n'est-ce pas ?

Mais bien sur vous-vous dites : et si le membre modifie son nom, l'information sera erronée ?

La réponse est simple : il suffit de supprimer le fichier texte lors de la modification des informations pour le régénérer avec les bonnes !!

Il y a néanmoins une limitation à l'utilisation de ce procédé : ne l'utilisez pas pour des données sensibles (mot de passe, email, etc.) car un fichier texte est beaucoup plus facilement accessible pour un pirate qu'une base de données...

Commentaires

  • maillard
    cool, l'article, mais moi j'ai un soucis et je ne trouve rien sur le net, j'aimerais créer des devis de mon back office, et j'ai vu avec html2pdf, seulement il faut créer un fichier txt d'a près ce que je comprends..je suis pas du tout développeur ou autre, j'ai réaliser mon site avec des tutus à droite et à gauche...mais la je sèche!!!

    moi ce que j'aimerais c'est récupérer les données de ma table sql et mettre ça dans un fichier txt en array, pour ensuite générer le devis en pdf..je trouve bien des choses à droite à gauche avec fopen etc..mais rien qui dit pour récupérer de ma table sql...
    des conseils, des tutos a me donner en lien??
    merci
  • MaX
    • 2. MaX Le Ven 26 Fév 2010
    voila mon problème si on a plusieurs lignes dans le resultat de la requête comment peut on les enregistrer ?
    car mysql_fetch_row n'enregistre qu'une ligne
  • MaX
    • 3. MaX Le Ven 26 Fév 2010
    c'est une trés bonen idée sauf que ca na p'as fonctionné est ce que tu peux nous donner un exemple tout pret ? :)

    et merci
  • Moidu
    • 4. Moidu Le Ven 19 Juin 2009

    Bonjour, dans ton exemple il manque la fonction lire_fichier, je tenais à te le signaler

    Excellente idée

Ajouter un commentaire