le cache c'est super, mais...

salut,

j'ai une petite fonction php qui permet d'afficher une image aléatoirement à chaque chargement de ma page d'accueil...

...enfin disons que ça marche bien quand je recalcule, mais forcément,
avec le système de cache, ben ça fonctionne pas.

Je m'apprête donc à faire un minuscule petit <INCLURE> qui ne contiendrait que ma fonction aléatoire et le <img> et auquel j'assignerais un delai de que dalle.

Mais est-ce vraiment la solution la plus pratique et surtout la moins gourmande ?

merci de vos conseils,

m.

Martin Granger a écrit :

salut,

j'ai une petite fonction php qui permet d'afficher une image aléatoirement à chaque chargement de ma page d'accueil...

...enfin disons que ça marche bien quand je recalcule, mais forcément,
avec le système de cache, ben ça fonctionne pas.

???
ben si, si tu mets du PHP dans tes squelettes, il est interprété à chaque appel !
C'est à eviter (avec des filtres) généralement, mais c'est ce qu'il faut faire dans ton cas je pense.
J'ai ca aussi sur un squelette (position aleatoire), c'est mieux que de generer 2 caches quasi-identiques (enfin, si le script est light, genre modulo 2 de microtime ...)

@++

Stephane LAURENT a écrit :

Martin Granger a écrit :

salut,

j'ai une petite fonction php qui permet d'afficher une image aléatoirement à chaque chargement de ma page d'accueil...

...enfin disons que ça marche bien quand je recalcule, mais forcément,
avec le système de cache, ben ça fonctionne pas.

???
ben si, si tu mets du PHP dans tes squelettes, il est interprété à chaque appel !
C'est à eviter (avec des filtres) généralement, mais c'est ce qu'il faut faire dans ton cas je pense.
J'ai ca aussi sur un squelette (position aleatoire), c'est mieux que de generer 2 caches quasi-identiques (enfin, si le script est light, genre modulo 2 de microtime ...)

@++

  Entièrement d'accord avec Stéphane j'ai eu le meme problème cette semaine.
J'ai du faire filtre.
C'est pas très esthétique mais je l'ai fait sur la balise #NOM_SITE_SPIP
dans mes fonctions.php3
function photo_aleatoire($texte) {
     $texte = ton code html générer par le php
     return( $texte);
}
dans ton squelette
  [(#NOM_SITE_SPIP|photo_aleatoire)]

Stephane LAURENT a écrit :

ben si, si tu mets du PHP dans tes squelettes, il est interprété à chaque appel !
C'est à eviter (avec des filtres) généralement, mais c'est ce qu'il faut faire dans ton cas je pense.
J'ai ca aussi sur un squelette (position aleatoire), c'est mieux que de generer 2 caches quasi-identiques (enfin, si le script est light, genre modulo 2 de microtime ...)

Vous allez rire, tous les deux, mais j'avais posté ce message après avoir cliqué 4 fois de suite en obtenant la même image ! D'où ma conclusion un peu hâtive. Depuis, je me suis aperçu qu'effectivement, ça fonctionne !

J'ai un peu moins saisi le message de Job (vu mon faible niveau de spipage, c'est normal) : quelle est la différence entre mettre une fonction dans mes_fonctions et la mettre dans un squelette ? (à part qu'on n'a pas besoin de la récrire plusieurs fois si on veut s'en servir à plusieurs endroits, je suppose ?)

--
martin

Martin Granger wrote:

Stephane LAURENT a écrit :

ben si, si tu mets du PHP dans tes squelettes, il est interprété à chaque appel !
C'est à eviter (avec des filtres) généralement, mais c'est ce qu'il faut faire dans ton cas je pense.
J'ai ca aussi sur un squelette (position aleatoire), c'est mieux que de generer 2 caches quasi-identiques (enfin, si le script est light, genre modulo 2 de microtime ...)

Vous allez rire, tous les deux, mais j'avais posté ce message après avoir cliqué 4 fois de suite en obtenant la même image ! D'où ma conclusion un peu hâtive. Depuis, je me suis aperçu qu'effectivement, ça fonctionne !

J'ai un peu moins saisi le message de Job (vu mon faible niveau de spipage, c'est normal) : quelle est la différence entre mettre une fonction dans mes_fonctions et la mettre dans un squelette ? (à part qu'on n'a pas besoin de la récrire plusieurs fois si on veut s'en servir à plusieurs endroits, je suppose ?)

Si tu la met dans mes_fonctions, le _résultat_ (pas la fonction) est stocké dans le cache, ce qui allège la charge de calcul du serveur (le but du cache).

--

Olivier G.
http://talath.no-ip.info/~carmine/blog/dotclear/index.php/

Martin Granger a écrit :

Stephane LAURENT a écrit :

ben si, si tu mets du PHP dans tes squelettes, il est interprété à chaque appel !
C'est à eviter (avec des filtres) généralement, mais c'est ce qu'il faut faire dans ton cas je pense.
J'ai ca aussi sur un squelette (position aleatoire), c'est mieux que de generer 2 caches quasi-identiques (enfin, si le script est light, genre modulo 2 de microtime ...)

Vous allez rire, tous les deux, mais j'avais posté ce message après avoir cliqué 4 fois de suite en obtenant la même image ! D'où ma conclusion un peu hâtive. Depuis, je me suis aperçu qu'effectivement, ça fonctionne !

=>cache du navigateur.
Pour eviter ca, dans le .php3 appelé :

  $flag_preserver=true;

  @header('Expires: Mon, 26 Jul 1997 05:00:00 GMT') ;
  @header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT') ;
  // HTTP/1.0
  @header('Pragma: no-cache') ;
  @header("Cache-Control: no-cache, must-revalidate");
  @header('Cache-Control: post-check=0, pre-check=0', false) ;

(il faut peut etre aussi balancer l'entete text/html, je sais plus)
(ca empechera egalement la barre d'admin d'apparaitre je crois)

J'ai un peu moins saisi le message de Job (vu mon faible niveau de spipage, c'est normal) : quelle est la différence entre mettre une fonction dans mes_fonctions et la mettre dans un squelette ? (à part qu'on n'a pas besoin de la récrire plusieurs fois si on veut s'en servir à plusieurs endroits, je suppose ?)

C'est pas vraiment l'emplacement qui compte mais la methode d'appel.
Si dans ton squelette, tu mets <? toto(); ?> ca sera interprété à chaque appel
Si tu mets [(#NOOP|toto)], le resultat sera mis en cache.
Le probleme, si tu utilise le cache, c'est qu'il faut en generer plusieurs et remonter le choix au niveau de l'appel du squelette (.php3 appelé directement ou via inclure)
il va donc faloir calculer un alea et le passer au contexte de facon à utiliser l'un ou l'autre des caches
en faisant un truc du genre (pastesté, pas sur de la syntaxe) :
  $contexte_inclus['alea']=microtime mod 2;

Ca te generera 2 cahces qui seront appelés aléatoirement.

Mais si tu regarde bien, le modulo est de toutes facons appelé à chaque appel de la page, ca ne donc pas forcement d'interet de faire 2 caches

D'ou ma reponse : dans ce cas precis, le php dans le squelette se justifie.

@++