Problématique de CACHE pour les images de mon site web

WRInaute occasionnel
Bonjour;

Mon site affiche des photos de personnes et j'ai la problématique suivante :

Afin d'optimiser la rapidité d'affichage de mes pages je voulais mettre en place une règle pour positionner un cache avec un .htaccess situé dans un répertoire de photos jpg :

Code:
# BEGIN Cache-Control Headers
<IfModule mod_headers.c>
   Header set Cache-Control "max-age=29030400, public"
</IfModule>
# END Cache-Control Headers

Celà aurait soulagé le serveur, et le navigateur client aussi mais j'ai un soucis :

Bien que chaque photo soit un fichier unique (donc une url unique) directement appelée en ressource static, j'ai 0.5% des photos qui sont modifiées n'importe quand par un utilisateur (possibilité de faire pivoter sa photo).

Du coup, avec ma règle pour le cache, impossible pour l'utilisateur ou des personnes ayant déjà affichées sa photo de voir la rotation effectuée ...

Bref un problème qui me semble insolvable :mrgreen:
Si quelqu'un à une approche différente ou une idée de génie je suis preneur, merci.
 
WRInaute occasionnel
SI modifier la photo implicait un rechargement de celle-ci en modifiant l'url de l'image, ajouter un argument virtuel?
 
WRInaute passionné
Tu devrais faire ton header avec un script php qui vérifie si le fichier a changé.
Normalement tu devrais pouvoir vérifier la date de modification du fichier et ainsi adapter les header.
La technique pourrait être de mettre une query string à la fin.
image.png?id=derniere modification.
 
WRInaute occasionnel
Mon soucis c'est que j'aimerais ne pas avoir à faire un .php qui renvoie l'image (beaucoup plus long que d'appeler l'image en ressource static).
 
WRInaute accro
Euh en ajoutant une date au bout du path de l'image, tu n'ajoutes pas de PHP non ?

C'est une technique très largement utilisée pour "dater" les feuilles de styles CSS et autres JS, ça doit en principe fonctionner pour les images : Julia a donc donné une excellente solution :)
 
WRInaute occasionnel
si j'ai bien compris :

j'ai une page index.php avec 1 balise
Code:
 <img src="/photos/photo-1242.jpg"/>

dans ma page index.php j'ai actuellement une fonction qui reçoit la PK de mon image en base et qui calcul le path à écrire dans l'output.
Il faudrait que je modifie ma fonction pour qu'elle compare date_création et date_modification (fonction php stat )de mon fichier image, et si je trouve une différence je renvoie un timestamp de la derniere modification dans le path. Ainsi la photo modifiée qui correspond à une nouvelle url forcera un rechargement coté client
Code:
 <img src="/photos/photo-1242.jpg?x=785454521"/>

Et les photos non modifiée je garde un simple
Code:
 <img src="/photos/photo-1242.jpg"/>

Je suis tout excité à l'idée de résoudre mon problème :mrgreen:
 
WRInaute occasionnel
J'ai fais plus simple, ma fonction qui calcul le path de mon image ajoute comme suffixe la date de création de mon image

Code:
$statPhoto = stat($chemin);
$chemin .= '?y='.@date('dmyHis',$statPhoto['ctime']);

Comme chaque rotation d'une photo créé en faite une nouvelle photo, cela rend unique l'url et permet de gérer le rafraichissement de l'image si besoin.


Merci beaucoup @Julia41 : j'avais mal compris ton explication mais c'est exactement ce que j'ai réalisé au final c'est parfait
Merci @cedric_g : tu m'a aidé à comprendre julia41 :wink:
 
WRInaute passionné
boby55 a dit:
J'ai fais plus simple, ma fonction qui calcul le path de mon image ajoute comme suffixe la date de création de mon image

Code:
$statPhoto = stat($chemin);
$chemin .= '?y='.@date('dmyHis',$statPhoto['ctime']);

Comme chaque rotation d'une photo créé en faite une nouvelle photo, cela rend unique l'url et permet de gérer le rafraichissement de l'image si besoin.


Merci beaucoup @Julia41 : j'avais mal compris ton explication mais c'est exactement ce que j'ai réalisé au final c'est parfait
Merci @cedric_g : tu m'a aidé à comprendre julia41 :wink:
Oui, je parle bien souvent trop "geek" (je me comprends tout seul donc je suis content) désolé pour ça.

Sinon, fait un peu gaffe à la fonction stat, elle est "très" gourmande (je dis "très" sur très gros site ça peut bouffer énorme).
Si tu as accès à ton php.ini ou que ton hébergeur te permet quelques fraudes par .htaccess
regarde du côté des variables :
realpath_cache_size
realpath_cache_ttl

Bon, après ça dépends réellement du nombre d'affichage que tu as. Sur des sites énormes, ça m'a permis de gagner énormément même si ça n'a pas value un vrai système de cache (les headers que tu donnes) car le "?" est généralement non caché (ndlr : ça veut dire variable).
Je te suggérerais bien de rewriter ça dans ce sens :
/photos/photo-1242.jpg?x=785454521
en
/photos/785454521/photo-1242.jpg

Bon, là c'est apache qui bouffra un peu plus.

Mettre ces images sur un serveur lighttpd pourrait être pas mal et pour le rewrite ça donnerait :
url.rewrite-once = ( "/photos/(.+)/(.*)" => "/photos/$1?x=$2" )
j'arrête ma propagande ;)
 
WRInaute occasionnel
@Julia41 : pas de soucis j'avais mal lu surtout :roll:

pour info je tourne à 12000 / 18000 pages vues par jour et j'ai un serveur dédié Kumsufi.

Je pense que pour le moment le serveur qui n'héberge que mon site devrait tenir la charge :wink:
 
WRInaute occasionnel
Julia41 a dit:
Bon, après ça dépends réellement du nombre d'affichage que tu as. Sur des sites énormes, ça m'a permis de gagner énormément même si ça n'a pas value un vrai système de cache (les headers que tu donnes) car le "?" est généralement non caché (ndlr : ça veut dire variable).
Je te suggérerais bien de rewriter ça dans ce sens :
/photos/photo-1242.jpg?x=785454521
en
/photos/785454521/photo-1242.jpg

Hello !

Je me suis fait violence et j'ai mis en place du rewriting de ce genre :

Code:
/photo-du-concours/2010-06-030610181834/mini_9*****.jpg

(Mon url contenant l'année, le mois pour trouver le répertoire de la photo, et le paramètre pour le cache)

J'ai effectivement remarqué que le plug-in FF PageSpeed se plaint du passage d'une variable pour une ressource statique. Et par ailleurs j'ai cru comprendre qu'avec un paramètre de ce genre , le cache proxy ne fonctionnait pas (meme si je me demande si c'est toujours utilisé de nos jours :mrgreen: )

J'ai aussi regardé ce que tu m'avais expliqué et modifié mon paramétrage PHP, mais sans trop savoir quelles valeurs conviendraient, j'ai doublé celles par défaut :
realpath_cache_size : 24
realpath_cache_ttl : 240
 
WRInaute passionné
Doublé c'est bien, tu peux même mettre des valeurs énormes si tu veux mais ça peut avoir les valeurs inverses.
Parfait pour le rewriting en tout cas, c'est beaucoup plus jolie je suis d'accord avec toi ;)
Si tu veux profiter de cache speed, tu pourrais regarder pour monter un serveur web sous lighttpd ou nginx pour ce contenu dans un sous domaine. Le cache proxy est pas mal utilisé en entreprise.

Enfin voilà, je pense que tu as trouvé la bonne solution, le realpath_cache est un "petit truc" tu vois vraiment les différences de perfs lorsque tu as un nombre de fichier énorme (supérieur à 100K) dans un seul répertoire.
 
Discussions similaires
Haut