Hello
Quand tes pages ont un id différent,
spip doit les calculer de nouveau car leur contenu est différent
et spip devant recalculer les boucles,
appelle donc à chaque fois copie_local.
C'est tout à fait normal et satisfaisant jusque là.
Pour la suite, ce que tu décris de tes tests et mesures
indique que copie_locale fait ce qu'on lui demande à chaque fois,
mais sans se demander s'il l'a déjà fait il y a peu
(ça se vérifierait en examinant le code).
Comme le id est différent, SPIP considère que tout est nouveau.
Ça n'est pas très étonnant : copie_locale n'est pas copie_locale_et_cache.
Ce boulot d'optimisation, puisque copie_locale ne le fait pas,
tu dois t'en occuper car le fait que le fichier xml ne change pas
c'est spécifique à ta situation.
Dans d'autres cas c'est pas le cas.
T'en occuper donc de la manière qui correspond le mieux à ton flux
et aux contraintes qui dépendent de ton application
(quand est ce que les données sont susceptibles de changer ?
y a t il un seul de ces fichiers ou plusieurs en nombre variables ?
il n'y a pas de réponse universelle)
Dans la mesure où ta boucle ne fait pas appel à ?id,
il y a une solution simple qui utilise le mécanisme standard de cache,
mais pour la boucle seulement, pas pour le squelette qui reçoit id :
mettre la boucle dans un petit squelette <INCLU> dynamiquement
qui reçoit en paramètre le nom du fichier à copie-localer
(ou même pas, s'il n'y en a qu'un seul toujours le même)
mais qui surtout ne reçoit pas id en paramètre !
Ainsi c'est cet <inclure> appelé dans le squelette article?id
qui gèrera la boucle et le cache de la copie_locale
Selon les cas, d'autres suggestions seraient envisageables :
- faire un <inclure> pas pour toute la boucle, mais seulement pour la copie_locale
(ça serait requis si le reste boucle faisait référence à ?id)
- faire une copie_locale du fichier une fois, en amont,
puis copier ce fichier sous un nom fixe et constant, et gérer le recalcul ensuite.
- juste enregistrer le nom de cette copie_locale quelque part (une variable de config)
et t'en servir par la suite, et gérer le recalcul...
C'est à tester et affiner.
J'espère ça t'aidera
JLuc
Le 30/03/2017 à 14:55, Syd Dolby a écrit :
Bonjour
J’utilise une copie locale d’un fichier distant, un fichier xml.
J’affiche des infos du fichier xml via la boucle DATA, avec un simple article, et une variable « id » dans
l’environnement :
spip.php?articleXX&id=ZZ
Ce fichier étant mis à jour régulièrement, j’utilise le mode {force} pour faire un recalcul de la page, de manière à
réimporter le fichier distant en local (normalement une seule fois bien sûr).
Mais après avoir fait beaucoup de tests, lorsque je passe d’une page à l’autre en changeant l’ID dans l’environnement,
les temps de calcul sont énormes, comme si le mode {force} rechargeait le fichier à chaque fois.
Temps de calcul de cette boucle avec le mode {force} (sans recalcul) : 22 389.050 ms
Lorsque j’enlève ce mode : 153.161 ms
Voici mon code :
<BOUCLE_adherents(DATA) {source simplexml, #VAL{http://ladressedemonfichier.xml}|copie_locale{force}}{datapath
root/children/member}>
#VALEUR{children/activity/0/text}
</BOUCLE_adherents>
<p><a href="[(#SELF|parametre_url{id,24})]">01</a></p>
<p><a href="[(#SELF|parametre_url{id,26})]">02</a></p>
<p><a href="[(#SELF|parametre_url{id,27})]">03</a></p>
<p><a href="[(#SELF|parametre_url{id,28})]">04</a></p>
<p><a href="[(#SELF|parametre_url{id,29})]">05</a></p>
<p><a href="[(#SELF|parametre_url{id,136})]">06</a></p>
Je ne vois pas d’où peux venir le problème.
Merci
_______________________________________________
liste spip
spip@rezo.net - désabonnement : envoyer un mail à spip-off@rezo.net
Archives : https://www.mail-archive.com/spip@rezo.net/maillist.html
Infos : http://listes.rezo.net/mailman/listinfo/spip
Documentation de SPIP : http://www.spip.net/
Irc : de l'aide à toute heure : http://spip.net/irc