WRInaute passionné
A la demande générale (ben oui 2 membres sur185832 incrits sur WRI, c'est [presque] l'unanimité :mrgreen: ) je publie aujourd'hui la version 2 de mon script de mise en cache.
En effet, l'ancien script avait quelques inconvénients (en vrac)
- difficulté a intégrer des données dynamiques (données de session par exemple)
- consommation importante et inutile d'espace disque (les données étaient mise en cache avec le code HTML)
- toute modification de "l'habillage du site" (charte, css,structure ...) impose de vider le cache en totalité
J'ai donc réfléchi à l'époque a un système qui ne cacherait que les données. J'ai tout d'abord réalisé la mise en cache à l'aide de fichiers XML (cela élimine certaines restrictions mais reste gourmand en espace disque et demande un traitement plus lourd qui consomme des ressources processeur)
Le système a fonctionné sans problème sur Fan de Cinéma pendant 1 ans. Mais je suis un puriste et j'ai cherché la solution ultime (pour qu'un script me satisfasse il faut qu'il marche mais aussi qu'il soit beau ! :mrgreen: )
J'ai fini par trouver la solution en utilisant la sérialisation des données en PHP. Le résultat est un système de cache léger, performant et totalement indépendant de la mise en forme des données coté HTML/PHP
Pas d'impatience, voyons d'abord les conventions utilisées :
1 ère étape : on crée un dossier nommé cache hors de la racine du serveur web (par exemple /home/cache/) sous le compte www:www (php peut y acceder en lecture et ecriture mais pas votre serveur web par mesurede sécurité). on peut structurer l'arborescence de ce dossier comme on le souhaite et selon ses besoins. Par la même occasion créons le dossier /home/classes/ pour stocker nos fichiers classes PHP
2 éme étape on crée des classe PHP qui aura en charge la lecture des données en BDD, la mise en cache et l'envoi des données aux scripts PHP. Une classe permet d'obtenir les données relative à un DVD, l'autre d'obtenir la liste des DVD ou figure une personnalité donnée (on fait simple) Dans notre exempe, les données relatives aux DVD seront cachées dans /home/cache/dvd/ et les données relatives aux personnalité seront cachées dans /home/cache/person/
La classe DVD est terminée, passons à la classe Person :
Le petit code de la fonction clean qui permet de fabriquer des noms de fichier conforme aux règles Unix
Voilà pour les classe que l'on met dans un fichier /home/classes/ma_classe.php
Voyons comment utiliser ces classes :
Cet exemple est très simple, son seul objectif étant de montrer le principe du système, je fais confiance à votre imagination. :wink:
Bon, si ce post passe pas en tête des recos, je bouffe mon avatar :mrgreen: :mrgreen: :mrgreen:
En effet, l'ancien script avait quelques inconvénients (en vrac)
- difficulté a intégrer des données dynamiques (données de session par exemple)
- consommation importante et inutile d'espace disque (les données étaient mise en cache avec le code HTML)
- toute modification de "l'habillage du site" (charte, css,structure ...) impose de vider le cache en totalité
J'ai donc réfléchi à l'époque a un système qui ne cacherait que les données. J'ai tout d'abord réalisé la mise en cache à l'aide de fichiers XML (cela élimine certaines restrictions mais reste gourmand en espace disque et demande un traitement plus lourd qui consomme des ressources processeur)
Le système a fonctionné sans problème sur Fan de Cinéma pendant 1 ans. Mais je suis un puriste et j'ai cherché la solution ultime (pour qu'un script me satisfasse il faut qu'il marche mais aussi qu'il soit beau ! :mrgreen: )
J'ai fini par trouver la solution en utilisant la sérialisation des données en PHP. Le résultat est un système de cache léger, performant et totalement indépendant de la mise en forme des données coté HTML/PHP
Pas d'impatience, voyons d'abord les conventions utilisées :
- 1 -on suppose que votre serveur web (apache, lighttpd, nginx ou autre) et PHP fonctionne sous le compte www:www (utilisateur www du groupe www)
- 2 - on suppose que la racine de l'arborescence de votre serveur web est /home/www/
- 3 - pour illustrer l'exemple, on suppose que nous avons une vidéothèque à gérer dont la BDD est la suivante:
table dvd : iddvd, titre, date,durée,format, synopsis
table personnalites : idperson, nom, prenom
table casting : iddvd, idperson
1 ère étape : on crée un dossier nommé cache hors de la racine du serveur web (par exemple /home/cache/) sous le compte www:www (php peut y acceder en lecture et ecriture mais pas votre serveur web par mesurede sécurité). on peut structurer l'arborescence de ce dossier comme on le souhaite et selon ses besoins. Par la même occasion créons le dossier /home/classes/ pour stocker nos fichiers classes PHP
2 éme étape on crée des classe PHP qui aura en charge la lecture des données en BDD, la mise en cache et l'envoi des données aux scripts PHP. Une classe permet d'obtenir les données relative à un DVD, l'autre d'obtenir la liste des DVD ou figure une personnalité donnée (on fait simple) Dans notre exempe, les données relatives aux DVD seront cachées dans /home/cache/dvd/ et les données relatives aux personnalité seront cachées dans /home/cache/person/
Code:
<?php
class DVD {
var $vars = array(); // c'est le tableau qui contiendra les données de la classe
fonction DVD($titre) {
if(file_exists("/home/cache/dvd/".clean($titre).".txt")===false) {
// on verifie si le fichier de données est en cache;
// la fonction clean permet de nettoyer les caractères spéciaux, son code est donné plus bas
// le fichier n'est pas en cache
// on fait ici le traitement pour lire la BDD et on stoque le résultat dans un tableau de la forme :
// Array {
// [Erreur] => true si le DVD n'existe pas, false sinon
// [Iddvd] => xxxx
// [Titre] => blablabla
// [Date] => blablabla
// [Annee] => xxxx
// [Format] => blablabla
// [Casting] => Array {
// [0] => Array {
// [Nom] => blablabla
// [Prenom] => blablabla
// }
// [1] => Array {
// [Nom] => blablabla
// [Prenom] => blablabla
// }
// [2] => Array {
// [Nom] => blablabla
// [Prenom] => blablabla
// }
// }
// on stoque ce tableau dans $this->vars
// il n'y a plus qu'à sérialiser le tableau et le stoquer dans le cache
$temp=serialize($this->vars);
$fd = fopen("/home/cache/dvd/".clean($titre).".txt","w");
if ($fd) {
fputs($fd,$temp);
fclose($fd);
}
} else { // le fichier est en cache
// on lit le fichier cache pour en extraire le contenu
$temp=implode("",@file("/home/cache/dvd/".clean($titre).".txt"));
// on désérialize le contenue et on le stocke dans le tableau $vars
$this->vars=unserialise($tmp);
}
}
// on implémente une méthode pour lire les données de la classe
function getAllVars() {
return $this->vars;
}
// on implémente une méthode pour lire un élément du tablau
function getVars($name) {
return $this->vars[$name];
}
}
?>
La classe DVD est terminée, passons à la classe Person :
Code:
<?php
class Person {
var $vars = array(); // c'est le tableau qui contiendra les données de la classe
fonction DVD($nom,$prenom) {
if(file_exists("/home/cache/person/".clean($nom).",".clean($prenom).".txt")===false) {
// on verifie si le fichier de données est en cache;
//la fonction clean permet de nettoyer les caractères spéciaux, son code est donné plus bas
// le fichier n'est pas en cache
// on fait ici le traitement pour lire la BDD et on stoque le résultat dans un tableau de la forme :
// Array {
// [Erreur] => true si la personne n'existe pas, false sinon
// [Nom] => blablabla
// [Prenom] => blablabla
// [Dvds] => Array
// [0] => Array {
// [Titre] => blablabla
// [Date] => blablabla
// [Annee] => xxxx
// [Format] => blablabla
// }
// [1] => Array {
// [Titre] => blablabla
// [Date] => blablabla
// [Annee] => xxxx
// [Format] => blablabla
// }
// [2] => Array {
// [Titre] => blablabla
// [Date] => blablabla
// [Annee] => xxxx
// [Format] => blablabla
// }
// }
// on stoque ce tableau dans $this->vars
//
// il n'y a plus qu'à sérialiser le tableau et le stocquer dans le cache
$temp=serialize($this->vars);
$fd = fopen("/home/cache/person/".clean($nom).",".clean($prenom).".txt","w");
if ($fd) {
fputs($fd,$temp);
fclose($fd);
}
} else { // le fichier est en cache
// on lit le fichier cache pour en extraire le contenu
$temp=implode("",@file("/home/cache/person/".clean($nom).",".clean($prenom).".txt"));
// on désérialize le contenue et on le stocke dans le tableau $vars
$this->vars=unserialise($tmp);
}
}
// on implémente une méthode pour lire les données de la classe
function getAllVars() {
return $this->vars;
}
// on implémente une méthode pour lire un élément du tablau
function getVars($name) {
return $this->vars[$name];
}
}
?>
Code:
function clean($src){
$accents = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
$pasaccents = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
$dest=(strtr($src,$accents,$pasaccents));
$dest=strtolower($dest);
$dest=ereg_replace("[^/[:alnum:]]"," ",$dest);
$dest=str_replace(" "," ",$dest);
$dest=str_replace(" "," ",$dest);
return (str_replace(" ","-",$dest));
}
Voilà pour les classe que l'on met dans un fichier /home/classes/ma_classe.php
Voyons comment utiliser ces classes :
Code:
<?php
// on commence par intégrer notre fichier classe à notre script
include("/home/classes-v5/actualites-v5.class.php");
// on initialise la classe avec un titre de DVD
$my_dvd = new DVD("nom du dvd");
// on peut maintenant obtenir les données relatives au DVD
$my_dvd_datas=$my_dvd->getAllVars();
// le tableau $my_dvd_datas contient l'ensemble des données relatives au DVD
// on peut vérifier si le DVD existe
if($my_dvd->getVars("Erreur") {
// le DVD n'existe pas
} else {
// le DVD existe
}
// on peut retrouver un élément particulier du DVD
$my_dvd_casting=$my_dvd->getVars("Casting");
// le tableau $my_dvd_casting contient le casting du DVD sous forme d'une liste nom,prénom
$my_dvd_format=$my_dvd->getVars("Format");
// la variable $my_dvd_format contient le format du DVD
// on peut bien sur faire de même avec la classe Person
// on initialise la classe avec nom prénom de personnalité
$my_person = new Person("nom de la personne","prenom de la personne");
// on peut maintenant obtenir les données relatives à la personnalité
$my_person_datas=$my_person->getAllVars();
// le tableau $my_person_datas contient l'ensemble des données relatives à la personnalité
// etc, etc ...
?>
Cet exemple est très simple, son seul objectif étant de montrer le principe du système, je fais confiance à votre imagination. :wink:
Bon, si ce post passe pas en tête des recos, je bouffe mon avatar :mrgreen: :mrgreen: :mrgreen: