Vous le savez certainement, les fichiers Javascript ou CSS sont placés dans le cache du navigateur pour être réutilisés sans devoir aller chercher les mêmes informations sur le serveur. C’est assez pratique car les fichiers en question ne sont téléchargés qu’une fois. Mais si vous modifiez ces fichiers après la mise en ligne, c’est la version placée en cache qui continuera de s’afficher jusqu’à ce que l’utilisateur vide son cache d’une façon ou d’une autre.
Pour y remédier, Damien Ravé nous propose une utilisation judicieuse de la fonction PHP filemtime() qui renvoie la date de la dernière modification d’un fichier pour recharger le cache CSS ou JS :
<script type="text/javascript" src="js/script.js?v=<?php echo filemtime('js/script.js'); ?>">
<link rel="stylesheet" type="text/css" href="css/ecran.css?v=<?php echo filemtime('css/ecran.css'); ?>">
Attention : C’est gourmand en ressource et qui plus est ça ne fait que déplacer le problème :
Manuel PHP > « Note: Les résultats de cette fonction sont mis en cache. Voyez la fonction clearstatcache() pour plus de détails. »
Pratique similaire utilisée pour loader des fichiers externes en flash (ajout d’une variable aléatoire en get dans l’url). Mais comme le dis Nicolas, tout n’est pas rose dans cette méthode.
Mais l’astuce reste sympa 🙂
@Nicolas F.:
Ca dépend de quelles ressources tu parle, parce qu’au niveau php, je pense que ça doit être assez négligeable.
Oui, j’ai lu aussi cette phrase, mais j’avoue ne pas voir précisément de quel cache il s’agit : celui du navigateur, celui de PHP lui-même, du serveur ?.. Bref, si tu pouvais me renseigner plus précisément, je suis preneur.
@julien:
Yep, c’est bien possible mais je viens de voir que Twitter semble utiliser cette méthode, et vu le nombre d’utilisateurs, je me dit que si twitter l’utilise alors nous le pouvons tous ! (je parle question performances brutes, pas d’éventuels effets de bord) 😉
Comme dit Nicolas, ça peut être un problème de performance sur des sites à fort traffic. Mais surtout, ça n’a de sens que si de l’autre côté les fichiers flash/js/css sont envoyés avec des entêtes de cache explicites.
Reste que c’est une méthode très connue et assez classique. C’est ce qu’utilise nativement rails à chaque fois qu’on inclus un statique (twitter c’est du Rails, d’où le fait qu’ils utilisent ça aussi).
Ceux qui travaillent sur de très gros sites utilisent de toutes façons des CDN pour les ressources statiques, ou au moins des serveurs différents. Là les CDN ne sauront pas mettre à jour un fichier sans changer le nom (d’où le fait que beaucoup de gros sites insèrent des dates ou des versions dans le nom du fichier lui même).
Sinon ça implique aussi de ne gérer le cache que dans le navigateur, certains proxy ne mettent pas en cache les fichiers ayant un paramètre de GET (ils devraient, mais ils ne le font pas).