Project

General

Profile

Evolution #21007

amélioration gestion du cache Arena dans ressources.php

Added by Renaud Dussol about 5 years ago. Updated about 4 years ago.

Status:
Fermé
Priority:
Normal
Assigned To:
Target version:
Start date:
07/04/2017
Due date:
% Done:

100%

Distribution:

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

Revision 47a8eadd (diff)
Added by Renaud Dussol over 4 years ago

Fixes #21007 : gestion du cache dans ressources.php

History

#1 Updated by Renaud Dussol about 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 about 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 about 5 years ago

Penser dans le commit à mettre "ref #id" ou "fixes #id"

#4 Updated by Renaud Dussol about 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 about 5 years ago

  • % Done changed from 0 to 80

#6 Updated by Renaud Dussol about 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 almost 5 years ago

  • Status changed from Nouveau to Fermé
  • % Done changed from 80 to 100

#8 Updated by Arnaud FORNEROT over 4 years ago

  • Tracker changed from Demande to Evolution

#9 Updated by Renaud Dussol over 4 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 over 4 years ago

  • Status changed from À valider to Résolu

#11 Updated by Arnaud FORNEROT about 4 years ago

  • Target version set to Envole 5.10

#12 Updated by Arnaud FORNEROT about 4 years ago

  • Status changed from Résolu to Fermé

Also available in: Atom PDF