Salut.
J'ai codé aujourd'hui (ou hier vu l'heure) un système de cache de données et je voudrais votre avis là dessus.
Je suis conscient qu'il est encore améliorable et c'est aussi pour ça que je viens vous demandez se que vous en pensez.
--> Explication :
Celui-ci enregistre, sous forme de tableau (array()) encodé en JSON dans un fichier, les données récupérées via SELECT.
Code source: http://wall.deblan.fr/x127/php/1/Systeme-de-cache-de-donnee-dataCache-class-php
--> A l'origine :
Je l'ai fais car je ne voulais pas utiliser un cache de vue (aka enregistrer une page toute entière dans un fichier) car je trouvais cette idée assez galère à utiliser par après.
Il aurait fallu supprimer la vue toute entière après chaque toute petite modification dans le code html, php ou même sur une page où on utilise plusieurs requêtes d'affichage.
Imaginez vous avez une page qui utilise 5 requêtes SELECT, 4 seulement ne changent que rarement tant dis que la 5éme change très souvent.
A chaque SELECT de la 5éme requête les 4 autres sont à refaire aussi alors qu'elles ne sont mises à jours que très peu souvent.
--> Utilisation :
Je l'instancie dans un attribut d'un conteneur (avec d'autres attributs d'autres instances) qui gère mes modèles ainsi quand je dois utiliser un modèle je mets l'instance actuel du conteneur en paramètre.
Ça me permet d'éviter une injection de dépendance.
A l'instanciation de dataCache il faut donner le dossier où sont rangés les fichiers .txt. Je donne ce paramètre au conteneur des managers quand j'instancie celui-ci dans mon contrôleur général (c'est lui qui instancie le bon contrôleur du bon module via un routeur et un dispatcher)
Dans les modèles j'utilise les méthodes dataCache::creer(), dataCache::recuperer(), dataCache::detruire() principalement (il y en a 2 autres comme dataCache::vider() et dataCache::cacheExiste()) quand cela est nécessaire.
Il faut préciser en paramètre à ces méthodes le nom du fichier .txt à utiliser (excepter vider() qui vide tout le dossier d'un coup).
On peut évidement renseigner dynamiquement le nom du fichier style:
$this->modelContainer->dataCache()->detruire('news
-'.$id);
Pour un multi SELECT (aka lister des éléments) il faut écrire ceci:
// Considérez que cette méthode se trouve dans le modèle d'un module de gestion de todo list
public function getListe(){
$todos = array();
if(!$todo = $this->managers->dataCache()->recuperer('todo_list
e')){
$requete = $this->managers->dao()->prepare('SELECT * FROM todos ORDER BY priorite DESC');
$requete->execute();
while($t = $requete->fetch(\PDO::FETCH_ASSOC))
$todo[] = $t;
$this->managers->dataCache()->creer('todo_liste', $todo);
}
foreach($todo as $t)
$todos[] = new Todo($t);
return $todos;
}
Le seul inconvénient pas encore gênant que j'ai trouvé c'est de devoir faire un foreach pour que l'array retourné par la fonction js_decode() de dataCache::recuperer() soit utilisable par la méthode Todo::hydrate().
Voilà si vous avez tout lu, vous êtes des champions et je vous en remercie.
Maintenant -> des avis ? des idées d'améliorations ? (surtout ça le plus important pour moi)