Comment faire un systeme de cache sur les requêtes en utilisant PDO?

Petit nouveau ! | 7 Messages

06 août 2015, 16:28

Bonjour,

J'ai le besoin d'insérer un system de cache pour certaine de mes requêtes mysql. Ma methode actuel ne fonctionne pas du tout, car en utilisant le PDO, il m'est impossible de serialize() les resultat des requêtes. J'ai essayer d'autre methode alternative tel que json_encode et autres. Rien n'y fait! Je vous montres ou j'en suis... et dite moi si vous avez une solution pour moi!

Voici ou j'en suis rendu :

Code : Tout sélectionner

function query($query,$cache=false,$time=1) { $cache_dir = ROOT_PATH.'cache/'; $cache_filename = md5($query); if($cache) { if(file_exists($cache_dir.$cache_filename)) { if(filemtime($cache_dir.$cache_filename) > (time() - 60 * 60 * $time)) { echo 'Loading cache<br>'; $return = file_get_contents($cache_dir.$cache_filename); } } } if (!isset($return) && empty($return)) { if(self::$Connect == true) { try{ if( $q = self::$Connect->prepare($query) ) { $result = $q->execute(); if(!$result) return false; else file_put_contents($cache_dir.$cache_filename, $q); } return $q; } catch(Exception $e) { //print_r(debug_backtrace()); error_log("database.error > #".$e->getCode().' > '.$e->getMessage()); die('<br />Error : '.$e->getMessage().'<br />N° : '.$e->getCode()); } } else { error_log("database.error.query > connection to database lost"); die('<br />Error : The connection to the database was lost.'); } } else { echo 'Return cache<br>'; return $return; } }
Vous avez des idées pour moi?

Merci d'avance!

ViPHP
ViPHP | 928 Messages

06 août 2015, 23:10

Ce qu'il faut que tu mettes en cache c'est le résultat de la requête, et non pas l'objet PDOStatement.

Pour récupérer tous les résultats de ta requête fait comme ceci :
$stmt = $pdo->prepare('ta requete sql');
$stmt->execute();
$results = $stmt->fetchAll();
Et ensuite tu mets $results en cache.

Note que je ne suis pas convaincu de l'utilité d'un cache fichier pour les requêtes SQL, puisque tu remplaces des accès à ta base par des accès fichiers ce qui n'est pas forcément terrible. Si tu en as la possibilité, utilise plutôt un cache en RAM du genre Memcache ou Redis, ou alors revoit tes index si tes requêtes sont trop lentes.

++

Petit nouveau ! | 7 Messages

07 août 2015, 15:14

je vais regarder mes indexes... dans le cas ou j'ai des jointures de tables, est-ce que je peux faire des indexations?

ViPHP
ViPHP | 928 Messages

11 août 2015, 21:08

Bien sur, il suffit d'utiliser des clefs étrangères c'est ce qu'il y a de plus efficace.

http://dev.mysql.com/doc/refman/5.6/en/ ... -keys.html