Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Amélioration du mécanisme du cache
#1
Bonjour,
Actuellement le code du routeur ne défini pas systématiquement une politique pour le cache. C'est fait pour certaines requêtes via la fonction cacheEtClose mais celle ci définie un max-age très court (1 ou 5 minutes).
Pour toutes les autres requêtes c'est le navigateur qui décide de les cacher comme bon lui semble et cela est probablement la cause des bugs temporaires que l'on a à chaque changement de version et que l'on corrige via des Ctrl + F5.

Afin d’améliorer cette situation je propose de déclarer explicitement la politique pour le cache pour chaque requête. Pour toutes les requêtes en rapport avec un update ou qui ont un contenu dynamique il faut que le cache soit désactivé. Pour les requêtes renvoyant un contenu statique il faut que le cache soit actif et que celui ci ne soit pas mis à jour tant que la version du routeur n'a pas changé.

Pour effectuer cela, je propose d'utiliser le header HTTP ETag (https://www.geeksforgeeks.org/computer-n...http-etag/). En utilisant le numéro de version comme ETag cela permet d'indiquer au navigateur que la ressource peut être lue depuis le cache tant que la version du routeur n'a pas changé.
Cela devrait améliorer globalement les performances de l'interface web car plus de ressources seraient cachées et pour plus longtemps. Un autre avantage est que cela limitera fortement, voir supprimera, le besoin de faire des Ctrl+F5 à chaque changement de version.

J'ai effectué ces changements en local et cela semble bien fonctionner.
Concrètement, j'ai supprimé la fonction cacheEtClose et j'en ai rajouté 2 autres :
Code :
void disableCache() {
    server.sendHeader("Cache-Control", "no-store, no-cache, must-revalidate");
}

bool checkCache(const char* etag) {
  String h = server.header("If-None-Match");
  h.replace("\"", ""); // Remove double quotes if any
  if (h.compareTo(etag) == 0) {
    server.send(304, "Not Modified");
    return true;
  }
  server.sendHeader("ETag", String("\"") + etag + "\"");
  server.sendHeader("Cache-Control", "no-cache"); // Force la validation depuis le server en comparant le ETag
  return false;
}

Pour toutes les requêtes que l'on ne veut pas cacher, j'appelle explicitement disableCache() et pour les autres checkCache en lui passant le ETag à comparer (la plupart du temps simplement la version du routeur).
Par exemple:
Code :
void handleRoot() {  // Pages principales
  if (checkCache(Version)) return;
  server.send(200, "text/html", MainHtml);
}

void handleAjaxHisto1an() {  // Envoi Historique Energie quotiiienne sur 1 an 370 points
  disableCache();
  server.send(200, "application/json", HistoriqueEnergie1An());
}

J'ai attaché à ce message le fichier Server.ino (renommé en Server.ino.txt afin de passer la validation) de la 17.04 qui contient toutes les modifications.
Le diff des modifications peut être également consulté en ligne ici : https://editor.mergely.com/CjtsuaPo

Qu'en pensez vous ?


Pièces jointes
.txt   Server.ino.txt (Taille : 33.53 Ko / Téléchargements : 2)
Répondre

#2
Très bonne idée Mike, car il est vrai que les MAJ cache, CTRL F5 sont un peu laborieux parfois.
je dis +1 !
Config : 3 routeurs F1ATB en V17.04 - 2 routeurs fixes en mode Triacs + 1 routeur mobile polyvalent en mode : Triac+SSR
PV : (8*425W + Onduleur SunGrow 3KW) + (2 *500w + MO Hoymiles HMS-1000W-2T)
Supervision & Domotique : F1atb + Home Assistant / Shelly & MQTT
Répondre

#3
Il y a longtemps que j ai refait les fonctions du cache ( pas de la même façon que Mike ) et plus jamais de soucis avec ctrl F5
Répondre

#4
Lolo, est ce que tu peux m'en dire plus sur la façon que tu as utilisé ?
Ma solution n'est peut-être pas la meilleure ou peut être améliorée, je suis preneur de toute info.
Merci.
Répondre



Atteindre :


Utilisateur(s) parcourant ce sujet :
1 visiteur(s)

Moteur MyBB, © 2002-2026 Melroy van den Berg.