Soluce ! Eviter le cache de l'explorateur web

Résolu
RideZeBigOne -  
 Brunchy -
Bonjour à tous!

j'avais posté il y a qqles semaines un message concernant un problème lié au cache d'IE : je créée une image (avec JPGraph) qui n'était pas rafraîchie par IE car elle porte tjrs le même nom.

voir exactement le pb ici (post précédent :
http://www.commentcamarche.net/forum/affich-1035977-Php-actualiser-image-%E0-cause-cache-ie

Aprés de longues recherches et autres tentatives de code tordus j'ai finalement trouvé sur un autre forum (anglais) une soluce aussi simple qu'efficace :

Il suffit d'utiliser la fonction time d'UNIX. Plus besoin des headers META avec le no-cache etc...
en voici qqles exemple:

<img src="http://www.mysite.com/myimage.jpg?<?echo time()?>">


echo ('<img src="../mydir/mypage.php?' .time(). '">' . '<br><br>'); 


Pour les explications voir ici:
http://forums.devshed.com/showthread.php?s=&threadid=40363&highlight=jpgraph+time

ou encore ici :

http://jpgraph.intellit.nl/viewtopic.php?t=349

J'espère que cela vous servira si vous avez ce genre de pb!!

A+
RideZeBigOne
http://www.sport2oufs.fr.st

34 réponses

  • 1
  • 2
Résumé de la discussion

Problème central est le rafraîchissement des images dans IE lorsque le nom reste identique et que le cache empêche le chargement actualisé, solutionnant via l’ajout d’un paramètre temporel à l’URL. La solution principale consiste à encoder time() (ou équivalents comme $_SERVER['REQUEST_TIME']) dans l’URL de l’image, ce qui génère une chaîne unique et trompe le cache sans modifier le nom du fichier. D'autres nuances rapportent qu'utiliser $_SERVER['REQUEST_TIME'] est plus efficace que time() car la valeur est déjà calculée, et certains déclinent l'approche à des contenus SVG ou d'autres formats nécessitant actualisation.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. Nicodème
     
    Immense merci, c'est carrément génial, voilà une nuit entière que je cherchais une solution...
    C'est beaucoup plus simple que de changer le nom de l'image.
    Je ré-explique à ma manière :

    Le code PHP avec la fonction time() génère un code html du type :
    <img src="../../images/soleil.gif?1161228656">

    IE trouve et affiche l'image "soleil.gif" sans broncher,
    mais cette astuce bluffe le cache qui compare "soleil.gif?1161228656"
    Or, comme ce chiffre change toutes les secondes, il recharge l'image à chaque nouvel appel de la page...

    Merci encore, tu me sauves la vie !
    Nicodème
    4
  2. rasdri
     
    ouahhhhhhhhhhhhhh !!!!!!!!
    une 1/2 journée à chercher ca !!!
    merci bcp!!
    IE fait vraiment chier, superbe astuce
    merci encore
    1
    1. totoduweb
       
      MERCIIIIIIIIIIIIIIIIIIIIIIII +++ d'avoir pris le temps de nous partager ta solution a ce ...?:XX;.. de IE7 !
      Cette solution est géniale :)

      comme d'autres avant... je cherchais depuis longtemps
      0
  3. beng
     
    j'ai une chose a dire MERCI!!!!!!!!!!!!!!!!!!!!!!!!!!!

    voila plusieurs heures que je cherche et je tombe sur ce topic
    et je commencai a me décourager car meme les header ne marchai pas avec moi.
    c'est EXACTEMENT mon probleme

    merci encore!!
    0
  4. Gihef Messages postés 5165 Statut Contributeur 2 781
     
    Merci d'être revenu nous montrer ça.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ninive
     
    Super, simple et fonctionnel.

    Merci !!
    0
  7. atomik
     
    Merci beaucoup. ça m'a grandement dépanné!
    0
  8. masternico Messages postés 491 Statut Membre 320
     
    ça c'est de la soluce béton... fallait y penser
    0
  9. masternico Messages postés 491 Statut Membre 320
     
    Par contre, il faudrait déclarer ce post "résolu"
    0
  10. Nicolas
     
    Bonjour,
    la solution est loin d'etre la meilleure car les images vont toutes s'empiler dans le disque dur du coté serveur !

    Cordialement
    0
    1. hihi
       
      ca s empliera dans le cache coté client uniquement ... vu que les images sont générés en dynamique par un script php par exemple
      0
  11. MMMX
     
    ABSOLUMENT GENIAL !!!!

    Ca fait plusieur semaines que je traficotte mon code pour essayer de parer le problème, et enfin, je tombe sur ce topic ! Mille mercis à toi RideZeBigOne !!!

    Petit message à Nicolas : tu dénigres une solution qui fonctionne parfaitement, sans faire de proposition ... très constructif comme commentaire. Ca ca nous permet vraiment d'avancer. Encore merci d'être passé !
    0
  12. masternico Messages postés 491 Statut Membre 320
     
    +1 MMX
    Je ne comprends pas très bien pourquoi les images s'entasseraient coté serveur? le serveur envoi toujour la même image, c'est plutôt coté client que ça s'entasse.
    De toute façon je ne crois pas qu'il existe de meilleur tour de passe passe pour contourner la mise en cache vue que chaque browser a ses propres paramètres. Ce qui va marcher chez l'un ne marchera peut être pas chez l'autre.
    Pour ma part, je maintiens que la soluce est bien. A l'utilisateur de vider son cache de temps en temps.
    0
  13. doblern Messages postés 2 Statut Membre
     
    Salut à tous,

    je n'ai pas bien compris la soluce,
    il s'agit de créer un filename unique sur l'image tel que toto.jpg123456 ?
    ou il s'agit d'une autre solution moin crade ?

    Merci d'avance pour vos réponses.
    0
  14. masternico Messages postés 491 Statut Membre 320
     
    Salut à toi (le renegat... pardon... des restes de jeunesse)
    En fait, le nom des images sur ton serveur ne change pas, tu ne change pas non plus de ligne dans ton script qui retourne l'image (dans l'exemple, c'est mypage.php).
    La seule chose qui change, c'est le lien d'appel de la page. C'est toute la beauté du truc en fait. Comme le lien d'appel change à chaque fois, le browser pense qu'il sagit d'une nouvelle page et donc écoute la réponse du serveur et donc reçoit la bonne image.
    Sinon, en l'abscence de cette astuce, comme le lien est le même d'un appel à l'autre, le browser se contente d'aller chercher la copie des éléments graphiques qui se trouve dans son cache.
    Maintenant, le cache pourrait quasiment être désactivé par défaut vu les vitesses de transfert actuels.
    La zone de cache était très utilile en des temps anciens, quand on parlait encore de ligne RTC et modem 56k. Car alors, quand il sagissait d'ouvrir une page et d'attendre jusqu'à une minute pour les pages les plus lourdes, il était pratique de récupérer les éléments graphiques déja téléchargé plutôt que de tout recommencer. Cela faisait gagner un temps fou.
    J'ai monté un petit ciber-café à un moment avec 10 machine et un serveur avec modem 56K dans un coin reculé du costa rica (c'est pas du pipot) et là, je pouvait dire que ça ramait. Les touristes cliquaient sur un lien et attendaient plusieurs minutes avant d'avoir leur pages.
    J'ai donc installé un proxy sur le serveur qui se chargeait d'orienter les paquet vers les machines (c'est son rôle) mais surtout, il centralisait le cache. Et là, oh miracle, les pages se chargeaient en un clein d'oeil...
    aaaaaah... nostalgie...
    Allez, bonne nuit, je vais me coucher
    0
    1. chldc
       
      De nombreux mois plus tard je tombe sur ta solution : magnifique !
      Je manipule des images svg en php je n'en pouvais plus de réactualiser ce cadre :
      '<embed src="'.$MonDossier.'/'.$NomImage.'svg?'.time().'">'
      Merci encore !
      0
  15. doblern Messages postés 2 Statut Membre
     
    Merci pour ta réponse masternico,

    je comprend bcp mieu la solution qui est proposée et il est donc vrai que c'est une bonne solution.
    Auparavant, je pensais que c'était une solution avec timestamp inclu dans le filename (ce qui est vraiment crade pour le serveur).

    Merci à tous pour la solution.

    Nicolas.
    0
  16. 2nys
     
    Bravo et encore bravo, des heures à chercher pour trouver ici.

    Et ca fonctionne aussi sur les input de type image!

    echo '<input type=image src="image.png?'.time().'" name="name" value="value" alt="alt">';
    0
  17. jms6501
     
    Cet astuce, c'est une perle !!!!

    Merci !
    0
  18. Am3d64
     
    Merci ca fonctionne nikel,

    Perso j utilse l'astuce sur une page d'administration (dans la colone de gauche j'upload l'image via un formulaire et dans la colone de droite j'ai un apercu via un include de la page où je modifie la photo) tout ca sur une page protegé via un .htaccess et ca passe !!!

    Seule petite modife que j ai apporté au code c'est:

    <img src="http://www.mysite.com/myimage.jpg?<?php echo time() ?>">

    plutot que:

    <img src="http://www.mysite.com/myimage.jpg?<?echo time()?>">

    je sais pas si ca a une grande importance mais moi ca passait pas bien sans <?php et l'espace apres time()

    Encore une nuit blanche que je ne regrette pas
    0
    1. puxor Messages postés 367 Statut Membre 89
       
      Très belle astuce, fallait juste y penser =)
      0
  19. LNA
     
    4 ans plus tard, ton post continue à faire des heureux!!! en l'occurence, une TRES TRES HEUREUSE puisque, comme bcp de personnes visiblement, j'ai galéré un bon moment avant de tomber sur ta superbe astuce! ;)

    encore merci RideZeBigOne!

    +++
    0
  20. famazigh
     
    merci

    j'ai eu le meme pb avec une image generée avec pear et avec la fonction time() ça marche a merveille

    c'est super
    0
  • 1
  • 2