Afficher la dernière version d'un fichier php ?

WRInaute passionné
Salut à tous,

Je n'utilise pas de CMS pour mon site, je cherche une solution afin d'afficher dans le navigateur de mes internautes la dernière version d'un fichier php, j'utilise des include pour insérer mes fichiers php.

Pour former une de mes pages html j'include plusieurs fichiers php :

- en-tete.php
- menu.php
- page.php
- footer.php

Quelles seraient les meilleures solutions techniques ?

Merci d'avance pour vos réponses.
 
WRInaute passionné
Ah, tu veux dire que la page reste en cache dans le browser des visiteurs ? Ca n'est pas normal, les pages dynamiques sont envoyées par le serveur avec les instructions pour ne pas être en cache. Les pages statiques ok, mais pas celles générées par php.

On peut ajouter ça (avant ton en-tete.php), mais encore une fois normalement c'est envoyé automatiquement par PHP :

Code:
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
 
WRInaute passionné
Merci rick38, oui c'est bien la question que je me posais : la page reste en cache dans le browser des visiteurs ?

Voici l'analyse de l'en-tête d'une de mes pages.

Code:
HTTP/2:    200
server:    nginx
date:    Mon, 08 Nov 2021 11:50:22 GMT
content-type:    text/html; charset=utf-8
content-length:    10921
x-powered-by:    PHP/7.2.34
expires:    Thu, 19 Nov 1981 08:52:00 GMT
cache-control:    no-store, no-cache, must-revalidate
pragma:    no-cache
set-cookie:    PHPSESSID=787s1vgpp2gb8mehe55hbv05td; path=/
set-cookie:    monnaie=EUR%2B0.00%2B20; expires=Tue, 08-Nov-2022 11:50:22 GMT; Max-Age=31536000; path=/; domain=www.mon-site.com
strict-transport-security:    max-age=31536000; includeSubDomains; preload
vary:    Accept-Encoding,User-Agent
content-encoding:    gzip
x-powered-by:    PleskLin
Dans mon fichier .htaccess j'ai ça :
Code:
<IfModule mod_headers.c>
  Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>
<IfModule mod_deflate.c>
  # Compress HTML, CSS, JavaScript, Text, XML and fonts
  AddOutputFilterByType DEFLATE application/javascript
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
  AddOutputFilterByType DEFLATE application/x-font
  AddOutputFilterByType DEFLATE application/x-font-opentype
  AddOutputFilterByType DEFLATE application/x-font-otf
  AddOutputFilterByType DEFLATE application/x-font-truetype
  AddOutputFilterByType DEFLATE application/x-font-ttf
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE font/opentype
  AddOutputFilterByType DEFLATE font/otf
  AddOutputFilterByType DEFLATE font/ttf
  AddOutputFilterByType DEFLATE image/svg+xml
  AddOutputFilterByType DEFLATE image/x-icon
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/javascript
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/xml

  # Remove browser bugs (only needed for really old browsers)
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
  Header append Vary User-Agent
</IfModule>
<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresDefault "access plus 14 days"
  ExpiresByType image/jpg "access plus 1 month"
  ExpiresByType image/gif "access plus 1 month"
  ExpiresByType image/jpeg "access plus 1 month"
  ExpiresByType image/png "access plus 1 month"
  ExpiresByType text/css "access plus 1 month"
  ExpiresByType application/pdf "access plus 1 month"
  ExpiresByType text/javascript "access plus 1 month"
  ExpiresByType text/x-javascript "access plus 1 month"
  ExpiresByType application/javascript "access plus 1 month"
  ExpiresByType application/x-shockwave-flash "access plus 1 month"
  ExpiresByType image/ico "access plus 1 month"
  ExpiresByType image/x-icon "access plus 1 month"
  ExpiresByType text/html "access plus 1 days"
</IfModule>
Le problème ne provient-il pas du Module mod_expires dans mon fichier .htaccess et des dates d'expiration de mes types de fichiers (jpg, html, css, etc....) ?

Les urls finales de mes pages sont toutes en html et pas en php.
 
WRInaute discret
Sauf indication contraire, les navigateurs mettent en cache.
Même des pages php car au final le php génère du html pour le navigateur coté client.
Le seul moyen de l'empêcher, est de mettre les en têtes données par Rick38.
Mais dans ce cas, la page n'est jamais mise en cache, même si le contenu n'as pas changé, et la vitesse du site s'en ressent.
Il n'y a pas de moyen de rafraichir uniquement si changement, c'est tout ou rien.
 
WRInaute passionné
Les pages php ne sont jamais mises en cache, comme le montre ton header, php envoie bien automatiquement ce qu'il faut :
Code:
cache-control:    no-store, no-cache, must-revalidate
pragma:    no-cache

Donc tu n'as rien à faire, ça fonctionne.
 
WRInaute passionné
Lorsque je modifie un fichier css sur mon site, je le télécharge ensuite sur mon serveur, je me connecte sur une page de mon site avec Chrome (j'avais auparavant déjà accédé à mon site donc les pages sont dans le cache de Chrome) et il ne m'affiche pas les modifications que j'ai faites dans mon fichier css, il faut que je vide le cache de Chrome et que je ré accède à mon site pour voir les modifications de mon fichier css.

D'où ma question de départ : comment faire pour indiquer au navigateur de charger la dernière version d'un fichier ?
 
WRInaute discret
Le css c'est diffèrent, c'est comme les javascript externe, si tu ne changes pas le nom, les visiteurs ont l'ancienne version en cache.
Sur des grosses modifications, il vaut mieux changer le nom du css.
 
WRInaute impliqué
Y'a une combine pour forcer un CSS "à jour" qui consiste à ajouter un suffixe en fonction de la date de modification, et à l'ignorer par une RewriteRule.

Si ça t'intéresse, je peux regarder ça. Par contre, c'est sur de la base Apache, pas NGINX.
 
WRInaute passionné
Merci pour vos réponses.

N'y a-t-il un moyen de créer un script php qui compare la date de dernière modification d'un fichier (php, css, js, etc...) et si elle est différente de celle présent dans le cache du navigateur de l'internaute de lui indiquer de télécharger cette nouvelle version de fichier ?

Ou bien alors, je stock dans un fichier php tous les noms et toutes les urls des fichiers (css, js) que je vais inclure dans mes pages via des include(...), faut-il manuellement à chaque fois que je modifie l'un de ces fichiers, le re-nommer en mon-fichier-2.css, mon-fichier-3.css, mon-fichier-4.css, etc...

Tous les webmasters sont confrontés à ce problème : on met à jour des fichiers sur nos sites. Comment gérez-vous cela ?

Comment gérer à la fois les problématiques de mise en cache (pour des questions de rapidité d'affichage des pages) et d'être certain que l'internaute a bien sous les yeux la dernière version d'un fichier (même s'il a visité notre site hier ou avant-hier) ?
 
WRInaute occasionnel
Bonjour,

Changer le nom du fichier CSS parait être un bonne méthode.
Maintenant quelle est la raison de vos modifications régulières du CSS ? En général une fois qu'on a trouvé son style on ne change plus grand chose, c'est le contenu qui change pas la forme.
 
WRInaute accro
Pour le CSS, avec filemtime ça changera automatiquement l'URL à chaque fois qu'il est modifié, exemple :
PHP:
<?php
$css = '/assets/css/styles.css';
?>
<link href="<?php echo $css; ?>?<?php echo filemtime($_SERVER['DOCUMENT_ROOT'] . $css); ?>" rel="stylesheet">
 
WRInaute passionné
Merci spout, ta solution marche super bien.

Comme quoi il suffit de rajouter pas grand chose pour faire de grande chose :)

L'avantage de cette solution, c'est que ça gère tout seul cette problématique de télécharger toujours la dernière version d'un fichier css, pas besoin de changer manuellement le nom du fichier css.

Est-ce que ça pourrait aussi fonctionner avec l'include de fichiers javascript ?
Code:
<?php
$fichier_js = '/js/fichier_javascript.js';
?>
<script src="<?php echo $fichier_js; ?>?<?php echo filemtime($_SERVER['DOCUMENT_ROOT'] . $fichier_js); ?>"></script>
 
WRInaute passionné
Mais ça fait un accès disque à chaque fois, on est peut-être dans la micro-optimisation mais j'évite à cause de ça :)
Et oui ça marche aussi avec les .js, les images et tout ce qui est statique...
 
WRInaute passionné
Mais ça fait un accès disque à chaque fois, on est peut-être dans la micro-optimisation mais j'évite à cause de ça :)
Si tu as un fichier css comme celui là
<link rel="../css/style.css?1636448407" />, si l'internaute l'a chargé dans son navigateur et si ce fichier css n'a pas été modifié, le navigateur de l'internaute utilisera celui du cache de son navigateur et il ne le re-téléchargera pas, il n'y aura pas un nouvel accès disque, non ?

J'ai testé avec les .js et ça marche aussi :)
 
WRInaute passionné
l'internaute utilisera celui du cache de son navigateur et il ne le re-téléchargera pas, il n'y aura pas un nouvel accès disque, non ?

Je parle de l'accès disque que fait la fonction filemtime() quand elle est exécutée.
Mais c'est insignifiant, à moins que tu aies des millions de visiteurs.
 
WRInaute passionné
je vois serveur nginx et tu parles de htaccess au risque de dire une connerie il y a pas un problème?
 
WRInaute passionné
Oui tu as raison, mes sites tournent sous un serveur nginx et j'ai des fichiers htaccess à la racine de chacun de mes sites et tout ça fonctionne.

J'utilise principalement mes fichiers htaccess pour mettre en place des redirections d'urls, faut pas faire cela avec nginx :( ?
 
WRInaute passionné
J'utilise principalement mes fichiers htaccess pour mettre en place des redirections d'urls, faut pas faire cela avec nginx :( ?
pour moi c'est pas compatible il un truc qui ressemble à ça quelque part :

Code:
location /
{
rewrite ^/.*-st([0-9]+).html /section.php?id_section=$1;


}
 
WRInaute passionné
> Note: Les résultats de cette fonction sont mis en cache.

Donc si le fichier change, ça ne prend pas en compte la nouvelle valeur si on ne fait pas clearstatcache().
Ou alors le cache ne dure que le temps de l'exécution du script, et auquel cas c'est comme s'il n'y en avait pas.

[edit] A priori la durée est configurable dans le php.ini, par défaut 120 secondes, si c'est bien realpath_cache_ttl dont il s'agit.
 
Dernière édition:
WRInaute accro
Tu dois avoir des règles de cache dans ton htaccess ou la config serveur.
Faut désactiver la mise en cache générale des fichiers php.
Plus intelligent que de la bidouille.
 
Discussions similaires
Haut