Evolution #21007
amélioration gestion du cache Arena dans ressources.php
100%
Description
A priori, plusieurs couches coexistent :
// Recherche du cache en base de données
$cache = null;
if ($__USE_CACHE && !isset($_GET["reload"])) {
$cache = R::findOne( 'arenacache', ' uid = ? and zone = ? ', array($uid,$zone));
}
// Reload demandé et pas de cache
if (isset($_GET["reload"]) && ! $cache) {
$cache = R::findOne( 'arenacache', ' uid = ? and zone = ? ', array($uid,$zone));
}
// Pas de cache, on va en créer un
if ($__USE_CACHE && !$cache ) {
$cache = R::dispense('arenacache');
$cache->uid=$uid;
$cache->zone=$zone;
// On le sauvegarde de suite,
// car si mode cluster il peut ne pas y avoir d'unicité, vue le temps pris par le chargement des WS
try {
R::store( $cache );
} catch (\Exception $e) {
}
}
// reload demandé
if ($cache && isset($_GET["reload"]) && ($_GET["reload"]=="true" ) ) {
$cache->clear();
}
Ensuite le test sur isRecent(), qui semble OK
J'ai l'impression que cela ne fonctionne pas dans toutes les situations, notamment si l'on tient (comme à Nice) à avoir un bouton "rafraîchir le cache arena"
J'irai plutôt vers quelque chose comme ça :
if ($__USE_CACHE) {
$cache = R::findOne( 'arenacache', ' uid = ? and zone = ? ', array($uid,$zone));
if (isset($_GET["reload"])) {
if ($cache) {
$cache->clear();
\R::trash($cache);
}
$cache = R::dispense('arenacache');
$cache->uid=$uid;
$cache->zone=$zone;
try {
R::store( $cache );
} catch (\Exception $e) {
echo $e;
}
}
else {
if ($cache && $cache->isRecent() ) {
on prend le cache
}
else {
on crée le cache à paritr du WS
}
}
else { // cas très rare, je me demande qui ne voudrait pas de cache vu la lenteur du WS
on balance tout à partir du WS
}
Si ça te convient et que tu ne remarques pas d'impossibilité/incompatibilité, je corrige sur feature/nice
Tu peux me réassigner si c'est OK
Associated revisions
Fixes #21007 : gestion du cache dans ressources.php
History
#1 Updated by Renaud Dussol over 5 years ago
Nouvelle version, qui semble fonctionner sur serveur de test :
if ($__USE_CACHE) {
$cache = R::findOne( 'arenacache', ' uid = ? and zone = ? ', array($uid,$zone));
//Si un cache est trouve dans la base pour ce user et cette zone,
//on vérifie s'il est récent ou si un reload n'est pas demandé
if ($cache && ((isset($_GET["reload"]) && ($_GET["reload"]=="true" )) || (!($cache->isRecent())))) {
//si un cache est trouvé mais qu'il est ancien ou qu'un reolad a été demandé, on le supprime
$cache->clear();
\R::trash($cache);
$cache = null;
}
if ($cache) { //si après ces vérifications, un cache existe encore, on l'utilise
$time = microtime(true) - $time_start_load;
echo "/* $zone: utilisation du cache ". $cache->updated. " in $time seconds */\n";
// Oui on va l'utiliser
$items = $cache->getCache();
$cache->access();
/*$sQuery = "UPDATE arenacache SET acceded='".$cache->acceded."' WHERE id=".$cache->getId();
R::exec( $sQuery );*/
$arrDesItemsArena[]=$items;
}
else { // si au final il n'y a pas de cache (soit pas au début, soit détruit apres les verifs), on en crée un
$cache = R::dispense('arenacache');
$cache->uid=$uid;
$cache->zone=$zone;
// On le sauvegarde de suite,
// car si mode cluster il peut ne pas y avoir d'unicité, vue le temps pris par le chargement des WS
try {
R::store( $cache );
} catch (\Exception $e) {
}
$time_start_load = microtime(true);
// récupérartion des items Arena via le web service
$result=$client->getRessourcesPortail($uid,$zone);
$items=objectToArray($result);
$time = microtime(true) - $time_start_load;
echo "/* $zone: getFromArenaWebService in $time seconds */\n";
// $metrics->arenaFromWebService($zone,$time);
// Création du cache, uniquement si des données sont remontées
if ($cache && is_array($items) && count($items)!=0) {
$time = microtime(true);
$cache->setCache($items);
$cache->access();
try {
R::store( $cache );
} catch (\Exception $e) {
}
// $metrics->arenaToCache($zone,microtime(true) - $time);
} // FIN du if ($cache && is_array($items) && count($items)!=0)
} //FIN du else (pas de cache)
} // FIN if (__USE_CACHE)
else { // on ne veut pas de cache, cas très rare vu la lenteur du WS
$result=$client->getRessourcesPortail($uid,$zone);
$items=objectToArray($result);
}
$arrDesItemsArena[]=$items;
#2 Updated by Christophe LEON over 5 years ago
- Subject changed from Refaire gestion du cache Arena dans ressources.php to amélioration gestion du cache Arena dans ressources.php
- Assigned To changed from Christophe LEON to Renaud Dussol
Ok, vue sur IRC,
je testerais la non régression sur le contexte ac-reunion
#3 Updated by Renaud Dussol over 5 years ago
Penser dans le commit à mettre "ref #id" ou "fixes #id"
#4 Updated by Renaud Dussol over 5 years ago
En test en prod chez nous, pour l'instant pas de pb
Je laisse passer l'été on regarde fin Août pour commit
#5 Updated by Renaud Dussol over 5 years ago
- % Done changed from 0 to 80
#6 Updated by Renaud Dussol over 5 years ago
Cela semble bien tourner
Cela dit j'ai eu un cas d'une personne dont le cahce semblait avoir été mis à jour et à qui il manquait une appli
Je vais donc refaire quelques tests en faisant des echos sur une machine de test avant de pusher
#7 Updated by Christophe LEON over 5 years ago
- Status changed from Nouveau to Fermé
- % Done changed from 80 to 100
#8 Updated by Arnaud FORNEROT almost 5 years ago
- Tracker changed from Demande to Evolution
#9 Updated by Renaud Dussol almost 5 years ago
- Status changed from Fermé to À valider
Je rouvre cette demande car notre version de prod de ressources.php comportait toujours ce code modifié par moi
J'ai mis le ressources.php d'origine (V.40 actuellement en prod) car il manquait l'info resarena dans les ressources et je me suis dit que c'était un bon moyen de faire un test sur le cache
Or immédiatement (aujourd'hui) nous avons eu connaissance d’utilisateurs à qui on avait ajouté une appli arena et qui n'arrivaient pas à l'afficher, même en utilisant le refresh
J'ai donc remis mon code modifié
Je commite / pushe sur patch pour mettre à jour, on en discute demain au tel
#10 Updated by Renaud Dussol almost 5 years ago
- Status changed from À valider to Résolu
Appliqué par commit 47a8eadd012715c6b48163c7a5accd40d9c20ae5.
#11 Updated by Arnaud FORNEROT over 4 years ago
- Target version set to Envole 5.10
#12 Updated by Arnaud FORNEROT over 4 years ago
- Status changed from Résolu to Fermé