Soluce ! Eviter le cache de l'explorateur web
Résoluj'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
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.
-
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 -
Une petite astuce pour éviter les rechargements inutiles et accélérer l'affichage.
Problème de la solution time():
Ca fait changer le nom du fichier en cache à chaque chargement de la page, donc l'utilisateur va devoir à chaque fois attendre le chargement de toutes les images de la page, même s'il l'a déjà visitée une fois et qu'il n'y a eu aucune mise à jour depuis.
Solution, la fonction filectime() en suffixe:
<IMG src='<? echo $picture."?".filectime($picture); ?>'>
La fonction filectime retourne la date de la dernière création du fichier.
Donc tant que l'image ne change pas, le nom identique à celui en cache dans IE, et l'image s'affichera immédiatement.
Quand l'image est mise à jour, la date de création change, donc le nom comparé au cache est différent, et uniquement cette image sera rechargée!
En espérant que ça vous aidera. -
J'avais le même problème et c'est réglé, merci beaucoup pour la solution !
Le cache est un outil du malin ^^
Merci !
Leneurone -
Bonjour a tous ceux qui tombent encore la dessus, encore un petit plus pour les fondus d'optimisation ;-)
"Pour avoir le temps en secondes, préférez $_SERVER['REQUEST_TIME'] à time (). En effet, time () demande un temps de calcul à PHP alors que $_SERVER['REQUEST_TIME'] est déjà calculé !"
Source: http://www.reflectiv.net/blog/optimisation-php/
Tchuss les potes. -
Différentes entêtes HTTP (pas les metas HTML) permettent de gérer/contrôler la mise cache.
Au niveau des requêtes envoyées par les navigateurs il est nécessaire de prendre en compte les entêtes Cache-Control, Age, If-Modified-Since, If-Not-Modified-Since, If-None-Match, If-Match.
Au niveau des réponses retournées côtés serveurs (PHP, ASP, JSP, ...) il est important de renseigner les entêtes Cache-Control, Last-Modified, ETag.
Pour plus de détails : http://www.creation-site-internet-le-mans.net/page.content/Cache_Web -
Salut, merci infiniment pour cette astuce aussi simple que pratique. A garder de côté pour des projets ultérieurs...!
-
hé bien, en fait non : si tu attribue un nouveau nom de fichier à chaque demande, tu ne résous pas le problème de la bande passante puisque tu oblige le serveur à renvoyer une nouvelle fois le fichier.
En fait, c'est vrais, le cache sert effectivement à éviter une surcharge de la bande passante.
Le problème pour nous développeur, c'est que si le nom de l'image reste le même, c'est l'image en cache qui est resservie.
Et contrairement à ce que pense la plupart des gents, cela ne concerne pas uniquement IE, car en fait, il y a plusieurs niveau de cache. Le plus e*******ant, c'est le navigateur (IE, FF, ...). Le navigateur va stocker sur le disque dur une version de l'image pour éviter d'avoir à la retélécharger lors d'un rafraichissement de la page (entre autre).
Ensuite, il y a le cache du proxy du FAI, car lui aussi à tout intérêt à éviter qu'un même fichier soit trop souvent téléchargé. Cela lui permet de resservir la même image à toutes les personnes connectées chez lui.
Enfin, on trouve aussi une zone de cache sur le serveur hébergeant le fichier image, car le serveur a tout intérêt à éviter une trop grande consommation des ressources disques.
Tout ce mécanisme a été mis en place à l'époque ou la seule connexion existante était le modem 56Kb (contre 8Mb actuellement en moyenne). Il était alors IMPÉRATIF de mettre en place les zones de cache, car quand on voit qu'il fallait des fois quelques minutes pour charger une page avec juste quelques images, le cache permettait de recharger en quelques secondes la même page.
La seule manière d'éviter le cache, c'est donc soit de changer le nom du fichier à la volée en rajoutant le suffixe '?' qui indique qu cache que c'est une requette dont la réponse peut changer, soit de changer le nom de fichier à chaque demande comme tu l'as indiqué. Mais alors tu te trouves avec le même problème de surcharge de la bande passante mais en plus, tu surcharge aussi ton disque dur...-
GENIALISSIME !!!!!
HYPER SIMPLE ET HYPER EFFICACE !!!
MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI - MERCI -
-
-
ca va bouffer la bande passante coté hebergement non? vaut mieux créer un nouveau nom pour l'image et le mettre dans la base de donnée
-
Merciiii!!
Excellent!!! heuresement que je suis tombé rapidemment sur ce topic, ca m'a évité de galérer :p
Encore merci pour cette brillante solution ;) -
hello,
bon j'ai du me résinscrire à CCM car je crois que c'était un des derniers messages que j'avais mis sur ce forum lol , je vois que j'ai bien fait de mettre l'astuce. Je rends à Cesar ce qui est à Cesar, je n'ai rien inventé, j'ai recopié l'astuce figurant dans les liens que j'ai mis dans mon message :-)
5 ans, pfiou ! j'avoue que j'ai eu du mal à comprendre ce que j'avais moi-meme écrit ... faut dire que depuis qqles années je ne touche presque plus mon site web ;-)
J'espère que l'astuce servira encore à d'autres, merci pour vos commentaires en tout cas ! :-)
http://www.sport2oufs.fr -
Merci! Oh grand dieu de la programmation,
Je m'incline devant toi,
Je prierai ta divinité jour et nuit...
J'vais pi etre m'arreter là, mais tu me sauve, ca fait plus de 3 jour que je suis la dessus :) -
Grandiose, fabulissime, mille mercis !!!
Ah ben, ça fait du bien : depuis le temps que je cherchais ! C'était tout c.. mais n'empêche qu'il fallait y penser.
Encore merci pour ce travail de recherche. -
Merci RideZeBigOne !!!!!
Tu m'as évité de longues nuits de travail !!!
Si je pouvais, je t'embrasserais !!!!!
@+ -
MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI MERCI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -
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 -
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!
+++ -
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 -
Cet astuce, c'est une perle !!!!
Merci ! -
Vraiement un grand merci
-
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">';
- 1
- 2