OVH Cloud OVH Cloud

Cache PHP/HTML : par ou commencer ?

2 réponses
Avatar
Sebastien
Voilà encore une fois tout est dans le sujet :

Appels à une base de données (MySQL) dont les entrées ne changent pas
tous les jours (certaines pas plus d'une fois par mois) mais sont
appellées plusieurs centaines de fois par jour...

Comment mettre en place un système de cache en partant de rien, c'est à
dire en débutant sur le sujet et éventuellement sans outil spécifique ?
Je veux dire par là que l'idéal serait de pouvoir coder la solution
plutôt que d'incorporer un produit/script existant, si c'est possible.

Sébastien

2 réponses

Avatar
John GALLET
Bonjour,

Voilà encore une fois tout est dans le sujet :
Oui mais non. Est-ce la solution la plus adaptée ?


Appels à une base de données (MySQL) dont les entrées ne changent pas
tous les jours (certaines pas plus d'une fois par mois) mais sont
appellées plusieurs centaines de fois par jour...


Donc un cache SGBD pourrait faire l'affaire aussi. Les diverses couches
d'abstraction de SGBD disponibles comme par exemple ADOdb disposent
nativement de ce type de cache. L'avantage est que c'est totalement
transparent dans les couches du haut, la seule contrainte (qui n'en est
pas vraiment une) est d'utiliser la couche d'abstraction en question.


Comment mettre en place un système de cache en partant de rien, c'est à
dire en débutant sur le sujet et éventuellement sans outil spécifique ?
Je veux dire par là que l'idéal serait de pouvoir coder la solution
plutôt que d'incorporer un produit/script existant, si c'est possible.


Autant je soulignais qu'il faut, quand on utilise un logiciel complet,
bien se méfier de ses failles, autant quand on a besoin d'une librairie
déjà développée par d'autres, on peut essayer de l'utiliser directement.
En se méfiant de ses failles également, il n'y a qu'à voir
http://isc.sans.org/diary.php?storyid‚3 par exemple, dommage pour les
utilisateurs de cette belle classe PEAR, mais on ne peut pas non plus
tout disséquer ligne par ligne (même si c'est du vrai hacking et très
instructif).

Maintenant sur le fond, en prenant un cas *simple voir simpliste* une
première approche peut consister à :

- supprimer sur le file system tous les fichiers du répertoire cache
datant de plus de xx minutes/heures etc... Ceci peut potentiellement
avoir lieu par crontab, ou par l'activité sur le site, cf
http://faqfclphp.free.fr/ chapitre crontab.

- prendre le md5 (ou toute autre signature simple) de la query string
(i.e. tous les arguments reçus), vérifier si un fichier HTML de ce nom
existe dans le répertoire cache (ne pas oublier l'appel à
clearstatcache()...). Si oui, le renvoyer. Si non, générer le html
correspondant en le bufferisant, l'écrire sur disque, et le renvoyer.

Ceci est une approche bourrin qui ne marchera pas sur des morceaux, i.e.
on cache toute la page, pas des bouts. Certains systèmes de templates
gèrent des caches HTML partiels.

Il y a probablement moyen de faire beaucoup plus fin/intelligent/etc...
mais cette première approche donnera un compromis correct simplicité de
développement / résultat.

HTH, JG
--
Les autres, c'est l'enfer.

Avatar
John GALLET
En complément :

- prendre le md5 (ou toute autre signature simple) de la query string
(i.e. tous les arguments reçus),


Plus précisement, on pourra différencier les arguments qui influent sur
le contenu de la page de ceux qui ne gèrent, par exemple, que des droits
d'accès mais n'influant pas sur le contenu. Gaffe aux données restées
côté serveur ($_SESSION ou tout mécanisme similaire).

clearstatcache()...). Si oui, le renvoyer. Si non, générer le html
correspondant en le bufferisant, l'écrire sur disque, et le renvoyer.


Pour cette partie : http://fr2.php.net/manual/en/ref.outcontrol.php

Pour des caches locaux (exemple : un bout de drop down dont les options
sont en SGBD pour simplifier leur modification par l'admin) on peut
aussi carrément générer un vrai fichier html commun à tout le monde à
chaque modification de la table (et un par jour pour faire bonne mesure).

Enfin, quelque part, c'est aussi le boulot d'un proxy. Jeter un oeil de
ce côté là éventuellement, sur les techniques utilisées en tous cas.

a++; JG
--
Les autres, c'est l'enfer.