INTEGREZ UN SYSTEME DE CACHE PERFORMANT DANS VOS CONTENUS DYNAMIQUES

cs_Matthieu26 Messages postés 6 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 9 janvier 2006 - 18 août 2005 à 23:53
cs_Defaite Messages postés 60 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 10 mai 2007 - 18 mai 2007 à 11:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/33299-integrez-un-systeme-de-cache-performant-dans-vos-contenus-dynamiques

cs_Defaite Messages postés 60 Date d'inscription jeudi 9 décembre 2004 Statut Membre Dernière intervention 10 mai 2007
18 mai 2007 à 11:58
Pareil que Wizard512, cette source permet de comprendre comment fonctionne le cache et comment l'utiliser.

Merci.
wizard512 Messages postés 459 Date d'inscription dimanche 9 janvier 2005 Statut Membre Dernière intervention 11 mai 2013 2
2 août 2006 à 11:44
bonne source et bon raisonnement,
ainsi qu'un débat intéréssant dans les commentaires.

note : 9/10

Bon prog....

~~ DotWizard512 ~~
aquewel Messages postés 143 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 6 juin 2010
4 sept. 2005 à 23:35
et peut on creer juste une variable chez l'user ??? et comment??? merci
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
19 août 2005 à 15:54
Ok :-)
Utilisateur anonyme
19 août 2005 à 15:27
Je ne peux pas mettre ton exemple en ligne car c'est du code spaghéti, on dois au pire publier des fonctions, au mieux des classes, afin que tout le monde y retrouve son compte.

Maintenant c'est vrai que j'ai bindé la sortie HTML sur une fonction, cela peut te sembler moins bien, mais y'à une bonne raison, c'est qu'à n'importe quel endroit du code utilisateur il peut faire un die. Ma fonction sera comme même appellée aprés ce die, donc la fonction EndCache est une fonction obsoléte (aparement) cependant elle permet de mettre fin à l'execution du bind de maniére plus élégante, et permet à l'utilisateur de choisir de son moment de fin, s'il souhaite continuer aprés le cache une sortie HTML dynamique.

Maintenant avec ton approche de la mise en cache partielle, je suis entrain de ré-écrire le code sous forme de classe, mais cela sort complément du domaine du tutoriel. Je la publierais donc en tant que source pour que tout le monde puisse en profiter en plus de ce tutoriel.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
19 août 2005 à 14:52
"Dans ce cas on ne peut pas mettre en cache aucune page. On peut parcontre imaginer de mettre en cache que des parties composant le site. Dans ce cas l'exemple que tu as donné est un bon moyen de prendre qu'une partie HTML du code et de la mettre en mémoire cache."

Exact :-)

"Mon exemple parcontre est à utiliser sur un portail de publication à haut trafic. Ce portail contient des informations mises à jour dans les bases de données par l'administrateur donc les pages, même dynamique ont un statut statique."

Tout à fait je suis d'accord mais pourquoi t'utilises autant de code alors que celui que je poste plus haut remplit la même fonction (à savoir piquer le code source d'une page pour qu'elle devienne statique) ?

<?php
ob_start();
if(file_exists('cache.machin'))
{
echo file_get_contens('cache.machin');
}
else
{
echo 'machin truc bidule contenu de la page';
$cache=ob_get_contents();
//inscrit ensuite le cache dans le fichier
$fp=fopen('fichier.machin','w+');
fputs($fp,$cache);
fclose($fp);
}
ob_end_flush();
?>

C'est quand même simple et optimisé (beaucoup plus que l'utilisation de regex sur le buffer) c'est pour ça que je ne comprends pas à quoi est destiné ton exemple, si y'a certaines parties qui doivent rester dynamiques ou pas, tu m'as dit que non et donc c'est pourquoi je t'envoie le code que j'aurais utilisé pour faire la même chose ;-)
Utilisateur anonyme
19 août 2005 à 14:46
Non, je me contredis pas mais peut être que je m'explique mal. Tu as un site (ecommerce) dans lequel dans tu as une charte graphique contenant une zone détaillant le total du pannier dans n'importe quelle page.

Ce total est tiré à partir du contenu du pannier client, enregistré par exemple dans une variable de session.

Dans ce cas on ne peut pas mettre en cache aucune page. On peut parcontre imaginer de mettre en cache que des parties composant le site. Dans ce cas l'exemple que tu as donné est un bon moyen de prendre qu'une partie HTML du code et de la mettre en mémoire cache.

Mon exemple parcontre est à utiliser sur un portail de publication à haut trafic. Ce portail contient des informations mises à jour dans les bases de données par l'administrateur donc les pages, même dynamique ont un statut statique.

On peut envisager de faire un systéme de cache plus évolué, mais je ne publie ici qu'un tutoriel et non une source. Je pense donner une technique optimisée, performante, et assez modulable pour subvenir à vos besoins. A vous de publier maintenant une classe de fonctions complétes permettant d'avoir une mise en cache des éléments statiques tout en gérant des parties dynamiques.

Je tiens à rapeller quelque chose (pour ceux qui souhaiteraient exploiter cette technique): le systéme actuel de cache permet de diminuer les instructions PHP pour l'execution d'une page. En effet, j'ai fait un OS de portail assez complet, tout en objet, modulable en XML, avec beaucoups de classes (mapping de la base de données) et j'en passe des meuilleures. Si maintenant je souhaiterais garder un certain dynamisme dans mes pages, il faudrais le chargement de cet OS qui à lui seul est assez gourmand. Il faut donc penser à rendre les modules dynamiques indépendants de cet OS si on veut optimiser le systéme de cache.

Je vais mettre à jour ma source pour y inclure les conséils d'anthomicro (merci au passage de tes remarques constructives).
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
19 août 2005 à 11:22
"je ne peux pas avoir des pages contenant des informations génériques au site et à la base de données"

plus loin :

"L'avantage maintenant c'est qu'il est intégrable facilement sur n'importe quel site"

Tu te contredis toi-même :-)

Par exemple pour mon site vu qu'il affiche le pseudo du membre en cours, je ne peux pas utiliser ton système. Si tu souhaites mettre à jour toute la source ça pas besoin de beaucoup de lignes de code :

<?php
ob_start();
if(file_exists('cache.machin'))
{
echo file_get_contens('cache.machin');
}
else
{
echo 'machin truc bidule contenu de la page';
$cache=ob_get_contents();
//inscrit ensuite le cache dans le fichier
$fp=fopen('fichier.machin','w+');
fputs($fp,$cache);
fclose($fp);
}
ob_end_flush();
?>
Utilisateur anonyme
19 août 2005 à 11:18
Anthomicro> Tout dépend de ce que tu entend par un autre systéme de cache. Je vais m'autocritiquer par rapport à ton systéme (je pense avoir saisit en partie ta technique).
Le désavantage entre mon systéme et le tient c'est que moi mettant en cache toute la page je ne peux pas avoir des pages contenant des informations génériques au site et à la base de données (exemple : liste d'articles de news) et des informations personelles à l'utilisateur (exemple: un menu utilisateur logué contenant ses infos personnelles).
L'avantage maintenant c'est qu'il est intégrable facilement sur n'importe quel site, et il n'execute aucune commande quand il doit lire le cache.

Exemple : J'ai un systéme qui lors d'une execution va prendre 60 ms pour s'executer. Une fois mis en cache il va prendre que 3 ms pour être lu. Ceci est indépendant des ressources mémoires qui auront servit à le mettre en cache (ça dépend en partie de la taille du fichier à charger).

Au niveau optimisation la fonction est rapide et offre une multitude de possibilités.

Concernant $GLOBALS['set_to_cache'], je suis obligé de passer par la car même si c'est une classe, elle se comporte comme toute variable, donc à une visibilité limitée dans certains cas. Si vous souhaitez qu'elle soit une classe, rien de plus simple, ajouttez dans le fichier cache.req.php :
class cache {
... les fonctions ...
}

Des mises à jours sont à envisager, permettant ainsi de mettre en cache que certaines parties HTML.

Dans ce tuto je vous explique seulement les bases, et je vous donne un exemple initial, qui reste bien-entendu à enrichir selon vos besoins.
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
19 août 2005 à 10:40
" Anthomicro > Ok. Et en gros tu regénère à chaque fois que tu changes dans la partie admin ? :)"

Non, en fait lorsque le cache n'existe pas et qu'un membre consulte l'article bah je génère le cache, sinon j'utilise le cache. Et quand j'update dans ma partie admin je supprime le cache.

"Mais donc dans ce cas, tu n'utilises pas ob_start() ?"

Si mais pas pour le cache :-)
cs_grandvizir Messages postés 1106 Date d'inscription samedi 8 novembre 2003 Statut Membre Dernière intervention 3 septembre 2006 22
19 août 2005 à 10:11
Il existait déjà un autre sujet :
http://www.phpcs.com/tutorial.aspx?ID=167
Naixn Messages postés 455 Date d'inscription mardi 17 septembre 2002 Statut Membre Dernière intervention 22 juillet 2007
19 août 2005 à 01:24
Anthomicro > Ok. Et en gros tu regénère à chaque fois que tu changes dans la partie admin ? :)
Mais donc dans ce cas, tu n'utilises pas ob_start() ?
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
19 août 2005 à 01:15
Naixn > c'est assez compliqué vu que c'est intégré à mon site, il s'agit d'un fichier texte qui contient le résultat d'une requête mysql, mais très peu de code html, pas la page entière en fait, mai s simplement le texte contenu dans l'article, le titre, etc...
Naixn Messages postés 455 Date d'inscription mardi 17 septembre 2002 Statut Membre Dernière intervention 22 juillet 2007
19 août 2005 à 01:11
J'oubliais : Merci aKheNathOn, même si je pense que tu aurais pû mettre ça en Class ( et ainsi éviter les GLOBALS ).
Mais sinon merci pour le principe :)
Naixn Messages postés 455 Date d'inscription mardi 17 septembre 2002 Statut Membre Dernière intervention 22 juillet 2007
19 août 2005 à 01:09
Anthomicro > Tu utilises quoi toi comme moyen pour mettre en cache ? Parceque c'est assez intéressant en fait :)
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
19 août 2005 à 00:35
Salut,

bof c'est gourmand ton système, on a pas forcément besoin de connaître la source de la page pour faire un système de cache (en tout cas pour mon système de cache je ne procède pas comme ça donc je parle en connaissance de cause). Je ne noterai pas car ton initiative est louable quand même vu qu'aucun tuto de ce type ne figure sur PHPCS. Pense à passer juste <? => <?php (ça me saute aux yeux lol)
cs_Matthieu26 Messages postés 6 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 9 janvier 2006
18 août 2005 à 23:53
Bravo aKheNathOn, car tu expliques de façon clair ta source... une fois encore, on est moins con tous les jours ;)
Rejoignez-nous