Projet

Général

Profil

Evolution #21007

amélioration gestion du cache Arena dans ressources.php

Ajouté par Renaud Dussol il y a presque 7 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
Début:
04/07/2017
Echéance:
% réalisé:

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

Révisions associées

Révision 47a8eadd (diff)
Ajouté par Renaud Dussol il y a presque 6 ans

Fixes #21007 : gestion du cache dans ressources.php

Historique

#1 Mis à jour par Renaud Dussol il y a presque 7 ans

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 Mis à jour par Christophe LEON il y a presque 7 ans

  • Sujet changé de Refaire gestion du cache Arena dans ressources.php à amélioration gestion du cache Arena dans ressources.php
  • Assigné à changé de Christophe LEON à Renaud Dussol

Ok, vue sur IRC,
je testerais la non régression sur le contexte ac-reunion

#3 Mis à jour par Renaud Dussol il y a presque 7 ans

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

#4 Mis à jour par Renaud Dussol il y a presque 7 ans

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 Mis à jour par Renaud Dussol il y a presque 7 ans

  • % réalisé changé de 0 à 80

#6 Mis à jour par Renaud Dussol il y a plus de 6 ans

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 Mis à jour par Christophe LEON il y a plus de 6 ans

  • Statut changé de Nouveau à Fermé
  • % réalisé changé de 80 à 100

#8 Mis à jour par Arnaud FORNEROT il y a presque 6 ans

  • Tracker changé de Demande à Evolution

#9 Mis à jour par Renaud Dussol il y a presque 6 ans

  • Statut changé de Fermé à À 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 Mis à jour par Renaud Dussol il y a presque 6 ans

  • Statut changé de À valider à Résolu

#11 Mis à jour par Arnaud FORNEROT il y a plus de 5 ans

  • Version cible mis à Envole 5.10

#12 Mis à jour par Arnaud FORNEROT il y a plus de 5 ans

  • Statut changé de Résolu à Fermé

Formats disponibles : Atom PDF