15-02-2009, 06:45 PM
Personnellement j'ai un peu de la solution a Sephi, mais comme je trouvais que ça faisait trop de hit sur la DB, j'ai donc implémenté un layer memcache ou je stock deux choses:
- perso_id:effect -> effect_id1;effect_id2;effect_id3
- perso_id:effect_timer -> effect_id1_time_left;effect_id2_time_left;effect_id3_time_left;
Et vu que l'object Effect est aussi dans memcache, si je fais
- perso_id:effect -> effect_id1;effect_id2;effect_id3
- perso_id:effect_timer -> effect_id1_time_left;effect_id2_time_left;effect_id3_time_left;
Et vu que l'object Effect est aussi dans memcache, si je fais
Code PHP :
<?php
try
{
$effect_id = DbConn::getKey($perso_id . ":effect");
$effect_time_left = DbConn::getKey($perso_id . ":effect_timer");
$effect = EffectMapper::get()->find($effect_id);
$effect->setTimeLeft($effect_time_left);
}catch(Exception $e){
$effect = EffectMapper::get()->findPersoEffect($perso_id);
}
A moins que memcache ne vienne d'être flushé ou que l'effect n'y soit pas encore, la fonction find() ira cherche l'objet dans memcache.
C'est rapide, léger et simple à mettre en place. Cependant attention, il faut penser a implémenter un système qui marche au cas ou memcache soit out, perso je stock sous la meme structure que Sephi, avec un time_added dans la table perso_effect, qui me permet de faire rapidement le calcul si besoin est (uniquement si memcache est inacessible).