|copie_locale et temps de chargement

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

Salut,

Pas sûr que ça t'aide, mais sache qu'au lieu de |copie_locale tu peux
utiliser le critère {datacache 2000} pour régler le cache de la boucle
data à 2000 sec :
http://code.spip.net/autodoc/packages/spip/core/compilateur/criteres.html#_function_critere_DATA_datacache_dist

Le 30 mars 2017 à 14:55, Syd Dolby <syd.dolby@gmail.com> 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

--
Beurt

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

Merci pour vos réponses

Je n’avais pas réalisé que le fichier était copié à nouveau pour chaque url différente. Ce n’est pas du tout ce dont j’ai besoin.
J’ai un fichier xml distant, qui me sert pour un listing d’items dans une rubrique, et aussi à définir un article pour chaque item.
J’ai donc besoin de mettre à jour une seule copie locale du fichier distant pour que le xml soit à jour sur toutes ces pages. Est-ce qu'il y a une autre solution qu'un boucle DATA ?

Je ne vois pas trop comment faire un inclure avec le nom du fichier à copier coller, puisque j’ai besoin de transmettre un tableau à mon squelette "listing" ensuite. Ce qui semble impossible à faire avec un inclure…

<BOUCLE_adherents(DATA) {source simplexml, #VAL{http://ladressedemonfichier.xml}|copie_locale}{datapath root/children/member}>
#SET{monTableau, #GET{monTableau}|push{
#ARRAY{
id,#VALEUR{children/id/0/text},
shortname,#VALEUR{children/shortname/0/text}
}
</BOUCLE_adherents>

<INCLURE{
fond=inclure/resume/listing,
monTableau=#GET{monTableau},
env
}>

Le 31/03/2017 à 11:12, Syd Dolby a écrit :

Je n’avais pas réalisé que le fichier était copié à nouveau pour chaque url différente. Ce n’est pas du tout ce dont
j’ai besoin. J’ai un fichier xml distant, qui me sert pour un listing d’items dans une rubrique, et aussi à définir un article pour
chaque item. J’ai donc besoin de mettre à jour une seule copie locale du fichier distant pour que le xml soit à jour sur toutes ces
pages. Est-ce qu'il y a une autre solution qu'un boucle DATA ?

Je pense t'avoir répondu
JL

Je ne vois pas trop comment faire un inclure avec le nom du fichier à copier coller, puisque j’ai besoin de transmettre
un tableau à mon squelette "listing" ensuite. Ce qui semble impossible à faire avec un inclure…

<BOUCLE_adherents(DATA) {source simplexml, #VAL{http://ladressedemonfichier.xml}|copie_locale}{datapath
root/children/member}>
#SET{monTableau, #GET{monTableau}|push{
#ARRAY{
id,#VALEUR{children/id/0/text},
shortname,#VALEUR{children/shortname/0/text}
}
</BOUCLE_adherents>

<INCLURE{
fond=inclure/resume/listing,
monTableau=#GET{monTableau},
env
}>

_______________________________________________
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

Le 31/03/2017 10:03, JLuc a écrit :

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.

C'est ce dont j'ai besoin.
J'ai importé le fichier xml dans un article, j'importe sa copie locale avec le filtre {force}.
Mais comme le dit Jluc, à chaque URL différente le fichier est rechargé, 20 secondes à chaque fois.

Je ne vois pas du tout comment faire pour passer les ID via un lien dans un squelette inclu, sans passer par une variable dans l'URL. Bref, je suis bloqué…

Hello,

Le 3 avril 2017 à 16:57, Syd Dolby <syd.dolby@gmail.com> a écrit :

Le 31/03/2017 10:03, JLuc a écrit :

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.

C'est ce dont j'ai besoin.
J'ai importé le fichier xml dans un article, j'importe sa copie locale avec
le filtre {force}.
Mais comme le dit Jluc, à chaque URL différente le fichier est rechargé, 20
secondes à chaque fois.

Je ne vois pas du tout comment faire pour passer les ID via un lien dans un
squelette inclu, sans passer par une variable dans l'URL. Bref, je suis
bloqué…

Désolé, j'ai sans doute mal compris, donc je me permets d'insister :
pourquoi utiliser |copie_locale qui te pose souci plutôt que
{datachace XXX} ?

--
Beurt

Le 03/04/2017 17:05, Beurt a écrit :

Désolé, j'ai sans doute mal compris, donc je me permets d'insister :
pourquoi utiliser |copie_locale qui te pose souci plutôt que
{datachace XXX} ?

Merci pour ton aide Beurt.
Je ne connaissais pas ce critère, il n'est pas décrit dans la doc SPIP.
Mais le problème reste le même, comme j'ai des URL différentes, le cache sera recalculé pour chaque item, soit 20 secondes à chaque fois.
Je cherche encore…

Le 04/04/2017 à 11:27, Syd Dolby a écrit :

Le 03/04/2017 17:05, Beurt a écrit :

Désolé, j'ai sans doute mal compris, donc je me permets d'insister :
pourquoi utiliser |copie_locale qui te pose souci plutôt que
{datachace XXX} ?

Merci pour ton aide Beurt.
Je ne connaissais pas ce critère, il n'est pas décrit dans la doc SPIP.
Mais le problème reste le même, comme j'ai des URL différentes, le cache
sera recalculé pour chaque item, soit 20 secondes à chaque fois.
Je cherche encore…

Non non non.
Pour que l'on comprenne bien : qu'est-ce qui est long réellement ?
- le téléchargement du fichier ?
- ou l'analyse par la boucle data (le fichier étant téléchargé) ?

Si tu dis qu'il faut 20s pour télécharger le fichier, pourquoi tenir au mode "force" déjà qui systématiquement va récupérer le fichier ?
Pourquoi pas le mode "modif" ? ('modif' - Si deja present, ne charger que si If-Modified-Since). Si le serveur qui héberge le fichier est capable de simplement envoyer les headers, ça devrait gagner un temps considérable (si c'est le téléchargement qui pose problème), lorsque le fichier en question n'a pas été modifié.

Maintenant la boucle DATA utilise un cache sur le fichier utilisé SI le plugin *Memoization* est actif. L'as-tu ?
Mais pour ce cache, évidemment il ne faut pas utiliser "force", ni même d'ailleurs utiliser "copie_locale".
Un {source simplexml, http://ladressedemonfichier.xml}{datapath root/children/member}{datacache 86400} devrait mettre en cache le fichier récupéré pour 1 journée, quelque soit l'URL de ta page.

Donc, à mon avis, il faut tester soit avec copie locale en mode modif, soit sans avec Memoization (je te conseille quand même de l'activer dès lors que tu joues avec des boucles DATA sur des URLs distantes).

Maintenant, si c'est la boucle DATA qui est trop longue à analyser (en testant avec le fichier en local), tu ne pourras pas changer grand chose, sinon à réduire d'une manière ou d'une autre la taille du fichier à analyser (ou réduire le nombre de boucles).

MM.

Le 05/04/2017 à 09:39, Matthieu Marcillaud a écrit :

{datacache 86400} devrait mettre en cache le

fichier récupéré pour 1 journée, quelque soit l'URL de ta page.

Notons que 1 journée, c'est le datacache par défaut.

MM.