Gestion de cache client.

ViPHP
ViPHP | 3607 Messages

16 mars 2010, 19:27

Bonjour à tous,

Sur le site que je construis actuellement, j'utilise déjà un système de cache via php.
Qui est utilisé de deux manières:
  • Via date d'expiration (par ex. une heure de validité pour une page donnée)
  • Via réinitialisation depuis l'administration
Je souhaite maintenant ajouter un cache côté client via la balise meta.
Je procède comme suit, dans mon gabarit, j'insère la ligne suivante:
	<meta http-equiv="expires" content="<?php echo date('D, d M Y H:i:s GMT',time()+3600);?>" />
Et puisque les pages sont mises en caches pour une heure, à chaque re-génération du cache, la meta expires est repoussée une heure plus loin.
Jusque là, à priori ça fonctionne pour l'utilisation (1) de mon cache php.

Maintenant si l'administrateur vient à supprimer lui même le cache, cela me pose problème, je ne sais pas comment indiquer que depuis la précédente visite,
la page à été regénérée... Tout en indiquant la nouvelle date d'expiration.
Des idées pour allier cache php & cache html ?

Si je ne suis pas assez clair dans mes explications, n'hésitez pas :)

Merci d'avance!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

16 mars 2010, 21:22

Le principe même du cache HTML est de ne pas réinterroger le serveur tant que la validité de la page n'est pas dépassé.
Or, la réinitialisation de ton cache via l'admin est une action faite sur le serveur.

Donc, soit tu prends en compte qu'il peut y avoir un décalage pour quelques clients, et tu peux laisser ton cache client, soit il faut que les pages sur le poste client soit toujours à jour, et là, tu ne peux demander de cache client.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 3607 Messages

16 mars 2010, 22:38

Ok,
Donc il faudrait que je classe mes pages en fonction de la fréquence des changements...
Petite question:
Pour une page ou il y a des news par exemple, si je souhaite qu'elle ne date pas de plus de 5 minutes, est-ce qu'il est utile de spécifié dans mon entête: "valide pour 5 minutes" ? Est-ce que pour des temps cours comme ça, les navigateurs ne sont pas assez optimisés?

D'une manière générale, si je mais des temps de validité de cet ordre:
  • "Pages statiques" : 1h (parce qu'il y a tout de même des corrections de temps à autre)
  • page de news : 15 minutes (même si il n' y a pas beaucoup de news, on souhaite parfois informer assez rapidement les utilisateurs)
J'ai un peu du mal à appréhender les temps pour épargner le serveur, mais ne pas léser l'utilisateur...

Dernière question:
Est-ce que l'ensemble cache serveur + cache navigateur ne risque pas de dégrader les performances? ou de faire des nœuds?

Merci encore!

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

17 mars 2010, 10:28

Le cache serveur consiste à faire en sorte qu'une requête soit plus rapide à s'exécuter sur le serveur.
Le cache client consiste à éviter d'envoyer une requête sur le serveur lorsqu'on dispose déjà de la page demandée.

Donc, avec l'un, l'autre, les 2, tu auras toujours une amélioration de la charge sur ton serveur. La combinaison des 2 étant, dans l'optique de la charge serveur, optimale.

Maintenant, les mauvais côté du cache sont le raffraichissement. A savoir que si tu veux mettre en cache des pages qui évoluent, il faut trouver un subtil équilibre sur le temps de mise en cache.
Et ça, on ne peut le présager pour toi.

Prennons un exemple : un site d'actualité, comme nexen. La page centrale ne peut être mise en cache côté navigateur, parce que soit tu mets un temps de cache de 1mn, ce qui ne sert presque à rien, soit tu mets un cache plus important, mais l'internaute risque de voir les actualités en décalés.
Du coup, pour cette page, le cache sera principalement sur le serveur, avec un principe de nettoyage sélectif, lorsqu'une nouvelle actualité est ajoutée.
Autre exemple, toujours sur Nexen, la page d'un article. Cette page est créée, et a peu de chance d'évoluer. Du coup, non seulement tu peux jouer sur le cache sur le serveur, mais également sur le client, en donnant 24h de durée de vie.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 3607 Messages

17 mars 2010, 10:44

ok j'y vois plus clair!
Je vais régler mes durées de vie en fonction de mes pages.
Question supplémentaire, pour les pages ou je ne souhaite pas avoir de cache client (ou que le pas est trop faible pour être utile), est-ce qu'il y a d'autres "réglages" métas important?
Est-ce que la meta "Last-Update" est utile pour les navigateurs? ou seulement pour les robots?

Mammouth du PHP | 985 Messages

07 avr. 2010, 12:39

Si je peux me permettre, les headers sont toujours prioritaires aux métas.
D'ailleurs c'est très facile a tester avec par exemple un header charset.

De plus une grande majorité des métas ne sont pas ou plus pris en compte par les navigateurs et même les robots de référencement.

Donc mon avis est que les métas sont importantes si et seulement si on n'a pas le choix, comme par exemple dans le cas de pages en html et encore finalement même pas car on a parfois tout de même des surprises (les headers peuvent être envoyés par le serveur lui-même).
Pour les pages en Php, tu gères au maximum avec les headers, et logiquement tu devrais pouvoir te retrouver avec une ou deux balises métas sans que cela ne pose aucun soucis...
Et ce quelque soit les headers envoyés par le serveur, car Php les écrase.
Et ce encore plus pour tout ce qui est gestion de cache :)
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

ViPHP
ViPHP | 3300 Messages

07 avr. 2010, 16:47

un bon cache non seulement a une durée de rétention mais un système de rafraichissement manuel pour l'utilisateur (qui doit etre sécurisé pour éviter qu'il en abuse)
Fait du php depuis que ca existe ou presque :)

ViPHP
ViPHP | 3607 Messages

07 avr. 2010, 18:06

Hello,
Très interessant l'idée de permettre à l'utilisateur de vider lui même le cache (en gros lui proposer de changer le header en place)...
Malheureusement dans mon cas, ça n'est vraiment pas le type d'utilisateur qui ira cliquer sur un lien aussi obscure qu'incompréhensible "vider mon cache" :)

Qu'est-ce que tu entends par "durée de retention" ? durée de vie d'une page?
Merci encore :)

ViPHP
ViPHP | 3300 Messages

07 avr. 2010, 20:33

la rétention c'est la durée de vie du cache oui, typiquement tu fais un cache qui s'auto invalide toutes les 24h (par exemple).
pour l'intitulé du lien faut trouver le plus approprié pour que l'utilisateur comprennes, mais ca marche pas si mal un petit refresh en haut à droite :)
Fait du php depuis que ca existe ou presque :)