Confusion dans les logiques de cache, pour les bots notamment
Constatant que des modèles coûteux, insérés dans des #TEXTE
, étaient calculés plusieurs centaines de fois par heure, je me suis penché sur la mise à jour des calculs et j'ai constaté que c'étit des robots, indexeurs ou spammeurs, qui provoquaient ces recalculs inutiles.
Le traitement de ces robots se différencie de celui accordé aux internautes sur la base de 2 critères :
- les robots spammeurs génèrent des appels avec une
REQUEST_METHOD
=POST
. Pour ces derniers, j'ai mis en place une détection des spams avant la mécanique de calcul SPIP (cf spip-contrib-extensions/nospam#5 (closed)) - les robots indexeurs bénéficient de
_IS_BOT
. C'est sur ces derniers que porte ce ticket.
Les robots nécessitant en général moins d'égards que les humains, on veut éviter une charge serveur inutile en leur servant le contenu d'un cache froid en priorité, s'il en existe un, plutôt que de calculer.
Le PhpDoc initial de cache_valide
indique que le retour est :
- «
1
si il faut mettre le cache a jour -
0
si le cache est valide -
-1
si il faut calculer sans stocker en cache »
On voit dans le code que -1 est renvoyé si _VAR_NOCACHE
, si $cache_inhib
s'est produit dans le hit courant, si #CACHE{0}
et si _IS_BOT
dans la plupart des cas logiques (et trop souvent dans ce que je constate).
La possibilité de "renvoyer le cache, même froid, s'il existe" n'apparaît pas explicitement mais peut s'obtenir en prétendant que le cache est valide et donc en renvoyant un 0
.
Confirmations :
- les commentaires sur dist#4859 ("Pas de cache 0 dans sitemap et robots.txt").
- les commentaires dans la fonction
cache_valide
"sauf pour les bots, qui utilisent toujours le cache" dans cache_valide quandX-Spip-Statique!==oui
et là tout à la fin
Par contre, un commentaire en L192 indique que les bots sont traités comme si il n'y avait pas de cache quand il n'y a pas de durée de cache explicitement spécifiée : "pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache)". Ainsi donc les caches seraient considérés comme invalides pour les bot lorsqu'il n'y a pas de #CACHE explicitement spécifié dans le squelette ?
Ce pourrait être l'origine du problème rencontré.
C'est touffu et je ne suis pas allé au bout.