JeuWeb - Crée ton jeu par navigateur
[SQL] Retour requete en cache - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [SQL] Retour requete en cache (/showthread.php?tid=3929)

Pages : 1 2


[SQL] Retour requete en cache - Single Dark - 26-04-2009

Bijour,

Voilà étant entrain de coder ma class SQL en POO, j'ai esseyé de faire un système de cache pour mes resultats de requetes.

Ca marche bien, même très bien, mais la je me pose une question existantiel. Elle va me servire a quoi cette fonction ?

Voila je m'explique :

Ma fonction permet de mettre dans fichier cache (.cache-X.ini), ou X est le numero de la requete, le retour de la requete. Je lui donne aussi un temps ou le fichier en question est toujours valide. Bah oui, au bout d'un moment les valeur changes...

Tous cela fonction très bien, mais c'est l'utilité de la chose qui me reste a expliquer. Parce que voilà elle sert pas en grand chose.

Parce que accouplé avec un système de cache classique pour un site web, cela ne sert pas a grands chose, en tous cas dans un site classique, mais pour un jeu web, cela peut prendre tous son sens...

Voila la fonction en question :
Code PHP :
<?php 
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
public function select_cache ($requete, $array=0, $time_expire=3600, $file='INCONNU', $line='INCONNU') // OP
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{

if (
is_file ('.cache-'.$this->nb_requete.'.ini'))
{
$time_exp = time()- filemtime('.cache-'.$this->nb_requete.'.ini');
}
else
{
$time_exp = $time_expire;
}

if (
$time_exp > $time_expire)
{



$retour_query = mysql_query ($requete);

if (!
$retour_query)
{
$errno = mysql_errno($this->connection);
$error = mysql_error($this->connection);
$this->get_error($file, $line, $errno, $error, $requete);
}

$array_select = array();

while (
$requete = mysql_fetch_assoc ($retour_query))

{
$array_select[]=$requete;


}

$this->requete[$array] = $array_select;
$requete = serialize ($array_select);
$new_file = $requete;
file_put_contents('.cache-'.$this->nb_requete.'.ini', $new_file);

}

elseif (
$time_exp < $time_expire)
{

$old_file = file_get_contents ('.cache-'.$this->nb_requete.'.ini');
$unserial = unserialize ($old_file);
$this->requete[$array] = $unserial;

}

else
{

$retour_query = mysql_query ($requete);

if (!
$retour_query)
{
$errno = mysql_errno($this->connection);
$error = mysql_error($this->connection);
$this->get_error($file, $line, $errno, $error, $requete);
}

$array_select = array();

while (
$requete = mysql_fetch_assoc ($retour_query))

{
$array_select[]=$requete;
}

$this->requete[$array] = $array_select;
$requete = serialize ($array_select);
$new_file = $requete;
file_put_contents('.cache-'.$this->nb_requete.'.ini', $new_file);

}

$this->nb_requete++;
}

Et le bout de code qui l'appel :

Code PHP :
<?php
$sql
->select_cache('SELECT * FROM NBA_EQUIPE', 'NBA', 3600, __FILE__, __LINE__);
?>

Ensuite la fonction retourne le contenu du cache dans mon array ou se trouve toutes mes requetes $this->requete[]

Pour l'utiliser rien de plus simple
Code PHP :
<?php
for ($i=0; $i < count($sql->requete['NBA']); $i++)
{
echo
$sql->requete['NBA'][$i]['VILLE'].'<br />';
}
?>


Voilà, j'attends un avis sur ma fonction. Savoir si je doit continuer à la déveloper.

Si vous avez des questions, I'm here...


RE: [SQL] Retour requete en cache - naholyr - 26-04-2009

Ne continue pas pour les autres, mais pour toi. En effet des systèmes de ce type existent déjà en grand nombre et de grande stabilité (avec la possibilité de vider un cache "X" manuellement, que tu n'as pas encore prévue mais qui est totalement indispensable Wink)

Donc si tu développes ce système pour toi, pour apprendre comment le faire, ou parce que tu veux que ce soit "toi qui l'as fait", n'hésite pas à continuer ce sont des raisons subjectives donc indiscutables.
En revanche si tu ne souhaites le continuer que si ça peut être utile aux autres, laisse tomber Wink


RE: [SQL] Retour requete en cache - Single Dark - 26-04-2009

Voilà, tout à fait, moi je suis contre l'utilisation de framework, ou autre, car je reste dans l'optique, de 'c'est moi qui l'est fait'. Je suis pas un pro, je bosse pas la dedans, je suis là pour apprendre, et c'est forgeant que l'on devient forgeron.

J'ai apprids beaucoup plus de chose derriere mon clavier, que d'esseyer de me servir d'un outils dejà existant.


RE: [SQL] Retour requete en cache - naholyr - 26-04-2009

Dans tous les cas regarde aussi ce qui se fait à côté, car c'est en apprenant des erreurs et des succès des autres que l'on avance plus vite que les autres Smile


RE: [SQL] Retour requete en cache - Zamentur - 26-04-2009

Bon j'ai pas eu le courage de tout lire, mais j'aimerais savoir la façon dont çà s'utilise:
quand on met en cache on peut récupérer le cache sur une autre requête http? Ou simplement un autre moment du script?

Si la réponse est affirmative à la première question, quels peuvent être les cas ou cela est nécessaire?

Pour moi je ne vois que des cas ou les données sont des données qui change très peu mais qui sont nécessairement en base de donnée afin de pouvoir faire des jointures et des traitements spéciaux avec.
Sachant qu'en dehors de ces traitements on peut avoir besoin directement de ces données et c'est là ou on ferais appel à ce fameux cache.

NB: çà sous entend qu'à chaque modif de ces données le cache doit être mis à jour de manière automatique pour éviter des bugs incompréhensible.
Fluxbb ne met par exemple pas à jours les données en cache quand on les changes dans la table config, ce qui amène à des bugs quand on change d'hébergeur ou de dossier ce forum. Sans compter que leur table de configuration ne leur sert à rien(pas comme dans le cas cité ci dessus)!


RE: [SQL] Retour requete en cache - Single Dark - 26-04-2009

Je te fait un 'tit schema histoire de voir comme cela fonctionne :

- On lance la requete ($sql->select_cache($param))
- Ensuite, si le fichier cache existe ET si il n'est pas trop vieux on l'ouvre
- Si le fichier n'existe pas on le crée, puis on fait la requete, le resultat est mit dans le cache, et on mets le resultat de la requete dans l'array
- Si le fichier est trop vieux, on execute la requete, on la mets en cache et on utilise le retour requete
- Si tous est bon, fichier pas trop vieux, on l'utilise


A savoir que j'utilise (un)serialize pour récuperer/mettre les données dans le fichier cache.
L'avantage, c'est qu'il n'y a pas besoin de faire 36 fois la même requete pour tous le site, il suffit juste de recuperer le fichier cache...

Pour exemple, un affichage de batiment. Les batiments ne vont pas changer toutes les 10 minutes, donc tu peut te permettre de faire un requete par jour (voir plus si besoin), et avoir 10.000 joueurs.

Pour la modif du cache, bon sur mon truc c'est pas automatique, mais il suffit juste de supprimer les fichiers caches pour réacualiser l'ensemble...


RE: [SQL] Retour requete en cache - Zamentur - 26-04-2009

Ok donc c'est bien l'utilisation que j'en pensais.
Citation :Pour la modif du cache, bon sur mon truc c'est pas automatique, mais il suffit juste de supprimer les fichiers caches pour réactualiser l'ensemble...
Je sais mais çà peut entrainer des incompréhensions suite à des oublis lors d'éventuel modif...

Tu as fait une méthode spécifique dans le cas ou tu veux que çà aille en cache, pourquoi ne pas faire une méthode pour le cas ou tu modifies les données de base afin de garantir que c'est synchronisé...

On peut même imaginer créer une méthode qui détermine les cas (à mettre en cache ou pas) en se servant de variable de configuration ou de convention ex:
- un array avec le nom des tables qui ne changent pas souvent (et donc à mettre en cache)
- ou encore utilisé un système dans le nom des tables (faire précédé d'un undescord par exemple) afin de déterminer si il y a cache ou pas...

Cela dit sur ce dernier point je suis moins confiant car çà demande soit du traitement sur la requête soit des spécifications lors de l'appel de méthode( et dans ce cas aucun avantage vis à vis de plusieurs méthode si ce n'est de pouvoir décider d'arrêter de cacher une table en changeant une seul valeur et non en changeant tout le code!)


RE: [SQL] Retour requete en cache - wild-D - 26-04-2009

prendre en compte le temps pour savoir si la requête en cache est toujours valide ou pas c'est bien... mais pour ça n'importe quel système de cache est capable de le faire; pas besoin qu'il soit interne à la classe sql non ? ^^

l'intérêt de coupler un système de cache interne à une classe SQL, c'est principalement dans 2cas (y en a surement d'autres que j'oublie Tongue)
1) un cache pour éviter à chaque requête http, de relancer la même série de requête SQL qui retourne les même résultats (surtout si les requêtes sont lourdes et récurrente alors que les données ne changent que rarement). Comme le souligne zamentur, l'intégrer à la classe SQL ça n'a de sens que si il permet une gestion "intelligente" du cache. (vider le cache lors des inserts, updates correspondant - ce qui est assez complexe si on veut quelque chose de suffisamment fin).

2) un cache pour éviter les requêtes SQL doublon; je l'ai vu sur des système modulaire; ou en fait chaque module est une brique quasiment indépendante. Chaque module fait donc ses requêtes dans son coin comme si il était tout seul; si la requête à déjà été présentée, par un autre module, on lui retourne direct le cache. L'intérêt étant de pas avoir à se préoccuper dans quel ordre les modules sont chargés, de pas avoir à gérer un chargement de données "communes". Tout ça étant géré de manière "transparente" pas ce cache SQL.

---
par contre ton système... je vois pas comment il peut fonctionner (compter le nombre de requête effectuées, et utiliser ce compteur comme id pour tes caches; tu pense pas que tu vas avoir un sérieux problème ?
genre tu vas faire comment quand tu auras plusieurs page/plusieurs module, donc en fonction de la page demandée par le joueur tu n'auras pas le même nombre de requête, et même si le nombre de requête est identique; chaque requête correspondra à une requête SQL différente).


RE: [SQL] Retour requete en cache - Single Dark - 26-04-2009

(26-04-2009, 06:48 PM)wild-D a écrit : par contre ton système... je vois pas comment il peut fonctionner (compter le nombre de requête effectuées, et utiliser ce compteur comme id pour tes caches; tu pense pas que tu vas avoir un sérieux problème ?
genre tu vas faire comment quand tu auras plusieurs page/plusieurs module, donc en fonction de la page demandée par le joueur tu n'auras pas le même nombre de requête, et même si le nombre de requête est identique; chaque requête correspondra à une requête SQL différente).

Gné ?!?

Lol, le truc tous simple, j'y avais pas pensé. Merci de me le faire remarqué... SD

J'ai reussi a résoudre se problème tous simplement, il suffit de donnée un nom a la requete.
Un nouveau paramètre qui enregistre le fichier cache sous se même nom (.cache-NOM.ini)
Et voilà, de cette facon il est possible de faire appel au fichier sur n'importe quelle page du site. Avec celà, même si deux joueurs ont un historique d'action differantes, celle reviendra au même grace au nom du fichier...

Enfin je crois.


RE: [SQL] Retour requete en cache - Zamentur - 26-04-2009

Tu peux aussi utiliser un système de clef unique identifiant la requête il ya plusieurs algorithme capable de générer des clés unique identifiant une chaine de caractère.
Notamment, md5 ou encore sha1.

Ainsi tu pourrais nommer tes fichiers automatiquement sans te préoccuper de leur nommage.
Une autre technique pourrait être d'enregistrer le nom de fichier et la ligne dans laquel est faite la requête puisque tu semble passer ces attribut!
$sql->select_cache('SELECT * FROM NBA_EQUIPE', 'NBA', 3600, __FILE__, __LINE__);