Gestion de cache

Mammouth du PHP | 1511 Messages

12 juin 2006, 12:02

Pour un moteur de blog que je dévellope en ce moment, j'ai du créer un système de templates qui lui est propre mais j'en arrive maintenant a la gestion de cache.
J'aimerais donc savoir si une personne pouvait m'aiguiller dans la gestion de cache sachat que celui-ci est juste un cache pour gerer le contenu d'un page, celle ci étant décomposée en trois parties principales:
- Header(juste l'en-tête)
- Corps (menus et contenu)
- Footer(pied de page)
Voila, merci d'avance! :wink:

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

12 juin 2006, 12:14

Tu devrais peut-être intégrer une solution existante type jpcache.

Mammouth du PHP | 1511 Messages

12 juin 2006, 12:21

En fait, ce qu'il faut juste, c'est que le contenu de chaque page de blog soit mis en cache et les commentaires de chaques billet mis a part et bien sur, a chqaque nouveau billet ou modification de billet on regenere le cache, a chaque nouveau commentaire de même.
Ca parait simple a premiere vue mais je prefere vous consulter afin de m'assurer que je ne dis pas de conneries...
@+ :wink:

ViPHP
fab
ViPHP | 2657 Messages

12 juin 2006, 23:27

perso j'utilise un systeme qui est intégré dans l'application et l'application est conçu pour marcher avec. Cad par exemple a chaque changement d'une donnée a affiché on génére un fichier html mais c'est lourd à faire :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Mammouth du PHP | 1511 Messages

13 juin 2006, 01:22

Fopen, fclose, etc... ?
@+

ViPHP
fab
ViPHP | 2657 Messages

13 juin 2006, 17:40

non c'est une génération de fichier HTML donc include "blabla.html";
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

13 juin 2006, 19:39

@fab : si ton fichier est entièrement composé de HTML tu ferais mieux d'utiliser readfile() à la place d'include()

Pour en revenir aux caches, le problème n'est pas tellement de le remplir ou de l'afficher. Le plus gros problème est de savoir quand et comment l'invalider. À mon avis, n'essaie pas de mettre le contenu de la page en cache sous la forme de HTML à moins qu'il ne s'agisse d'un très gros site (plus d'un millier d'utilisateurs). Concentre-toi sur les données qui prennent le plus de ressources pour être générées et mets-les en cache avec APC ou sauve-les dans un fichier sous forme sérialisée ou sous forme de PHP avec var_export(). Sache qu'un return dans un fichier include devient le résultat de la fonction include donc si ton fichier cache ressemble à
<?php return array('un', 'deux'); ?>
alors
$nombres = include('fichier_cache.php');
remplira la variable $nombres avec le tableau ci-dessus.

Pour invalider le cache, tu peux soit le faire expirer n secondes après génération, --auquel cas il te suffit d'utiliser filemtime() sur le fichier pour connaitre son âge--, soit manuellement en effaçant le fichier avec unlink() à chaque fois que tu sais que les données ont changé.

Dernière chose, je te recommande d'implémenter ton cache progressivement en mesurant les gains en performance à chaque étape. On peut facilement se laisser entraîner et en faire trop pour finalement pas grand-chose.

ViPHP
fab
ViPHP | 2657 Messages

13 juin 2006, 21:58

filemtime est une solution qu'il vaut mieux éviter niveau temps :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

13 juin 2006, 22:10

Pourquoi ça ?

ViPHP
fab
ViPHP | 2657 Messages

13 juin 2006, 22:59

niveau temps d'éxécution c'est vraiment lent fait un bench tu veras :p
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

13 juin 2006, 23:53

Je doute que la "lenteur" de filemtime() importe beaucoup dans le cas de momox. Pour un très très gros site j'utiliserais certainement autre chose, mais il faut replacer les choses dans leur contexte : filemtime() est aussi lent à exécuter qu'un include sur un fichier vide. Je l'ai "benchmarké" sur mon propre ordinateur sous WinXP : filemtime() + clearstatcache() sur un fichier existant prend environ 58 µs, filemtime() sur un fichier inexistant avec error_reporting(0) prend 65 µs. À titre de comparaison, include() sur un fichier vide prend 85 µs.

Il faut comparer ce qui est comparable, les performances de filemtime() sont de l'ordre de celles de preg_replace(). Autrement dit, un pourcentage infime du temps de génération global. Comme je le disais dans mon précédent post, il est important de ne pas se lancer prématurément dans des optimisations qui n'ont finalement que peu d'influence au niveau global pour pouvoir se concentrer sur ce qui prend le plus de resource, à savoir : l'accès aux données de la base, le moteur de template, et en règle générale tout ce qui se trouve dans une boucle.

Mammouth du PHP | 1511 Messages

14 juin 2006, 01:26

Au fur et a mesure de mes reflexions, je me suis apercu que ce n'était pas une bonne idée le cache pour le moment...
Ca me parait assez difficile a gérer...
Je vais reflechir car ca demande du temps et de la patience un tel système...
Je vais d'abord finir le dev de ma class de templates ensuite je verrais.
@+

Mammouth du PHP | 1511 Messages

15 juin 2006, 13:09

Bon, j'ai attaqué la classe de templates, mais une question subsiste maintenant...
Sachant que le cache mêmorise pendant deux secondes le contenu de la page(sachant que une page = 3 parites, a savoir header, contenu et footer et que seul le contenu est caché), que dois-je donner comme nom au fichier cache, qui lui permettrait d'être identifié?
Un identifiant numérique par page ou quelque chose en fonction de l'url, sachant que les variables dans l'url peuvent être déplaces et que cela ferait plusieurs caches de générés, sans oublier que le cache serait vidé tous les soirs a minuit et que le fichier cache d'une page porterait toujours le même nom et seul son contenu serait regenéré?
@+
PS: quelqu'un aurait il de l'aspirine?

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

15 juin 2006, 14:51

Pourquoi ne vouloir cacher que le contenu ? Es-tu sûr que ça a réellement un sens dans une fonction de mise en cache ?

Mammouth du PHP | 1511 Messages

15 juin 2006, 18:24

En fait, il faut que je ne cache que le contenu car tout ce qui est header et footer est 'variable' du fait que certaines variables changent en fonction du pseudo du membre et d'autres parametres telles que la feuille css.
A moins que je ne parse que certaines variables a la fin, ce qui est tout de même assez bizarre je dois l'avouer...
@+