[PHP] Gestion de vos fichers caches

WRInaute discret
Hey,

Alors depuis un petit bout de temps, je me suis mis à utiliser les fonctions ( bien pratiques j'avoue ) de cache de PHP ( ob_start etc ) et je m'interroge sur la meilleure structure pour stocker mes fichiers caches alors j'aimerai bien savoir comment vous faites.

Je vois deux manières, je stocke mes fichiers caches dans leurs dossiers respectifs ( par exemple, les fichiers caches du dossier actus dans le dossier actus ou dans un dossier cache à l'interieur ) ou alors vous avez un dossier cache à la racine de votre site et vous y stockez vos fichiers caches ( la encore dans des dossiers ou non ).

Peut-être que ça change pas grand chose, peut-être que si alors j'aimerai bien avoir vos retours :)
Ah oui comment gérer vos le cache une fois crée par exemple si vous voulez éventuellement l'effacer ou autre, à la main ou avec des fonctions ?

Merci :)
 
WRInaute discret
Moi je crée un seul dossier cache sinon c'est la galère pour attribuer les droits de permissions d'écriture dans toys les dossier.
 
WRInaute impliqué
Si tu as énormément de pages à mettre en cache je te conseil de le mettre dans un dossier couplé avec des sous-dossiers, sinon tu risques de faire sauter ton FileSystem ;-)

Sinon en ce qui me concerne, j'ai actuellement un url rewriting, ce qui me permet de créer physiquement la page html.

Exemple de procédure :

Rquête http -> Url Rewrite avec check sur le fichier

Il existe ? Pas de souci on envoi la page à l'utilisateur (html)

Elle n'existe pas ? On envoi sur un fichier PHP (transparent pour l'utilisateur) celle-ci check sila page existe dans la base de donnée.. c'est le cas ? On crée le fichier html en dur et on laisse aller le visiteur, sinon en renvoi vers une 404 !

A+
 
WRInaute occasionnel
mahefarivony a dit:
je laisse eAccelerator tout gérer, je pense qu'il fait tout ça mieux que moi :)

Je pense que notre ami parle de cacher en fichier les pages générées, ce qui n'est pas la même chose que eAccelerator.

eAccelerator va permettre une exécution plus rapide du script PHP, mais imaginons que ce dernier fasse une dizaine de requetes complexes a la base de données pour construire la page résultante, eAccelerator ne pourra rien y changer, il faudra cacher le fichier dans un filesystem.
Si vous avez un dédié avec un peu de RAM, montez dans un répertoire précis un filesystem logé en RAM pour y écrire vos fichiers de cache (un md5 de l'URL par exemple).
Pkoi en RAM ? Le parcours du répertoire à la recherche d'un fichier en cache, et sa lecture pour le cracher à Apache n'en seront que plus rapide. Et puis, si la machine reboote, ce n'était que du cache, aucun problème...

Cela dit, eAccelerator est indispensable sur un site à forte charge.
 
WRInaute accro
Elvis a dit:
https://www.webrankinfo.com/forum/t/script-mise-en-cache-des-pages-php.28614/
Pour ma part je me suis inspiré d'un script donné sur ce topic pour cacher mes pages pour lesquelles le code n'a pas besoin d'être exécuté à chaque visite.

Salut Chacho.
Pareil que Elvis, ce petit script est assez simple et pas mal du tout, on peut l'utiliser pour mettre en cache toute la page ou une partie seulement de la page. Je l'utilise pour mettre en cache une partie de certaines pages de mon site qui font appel à une grosse requete sql longue à exécuter.
 
WRInaute discret
Merci de vos réponse :)
Moi aussi je me suis inspiré de ce script pour faire mon système de cache. Mais dans ce script toutes les pages sont enregistrées dans le même répertoire :

Code:
$fichierCache="cache/cache".$urldemandee; // on construit le chemin du fichier cache de la page

Je me dis juste que voilà, si on applique ça sur un nombre important de pages, on va se retrouver avec *beaucoup* de fichiers dans ce dossier. Je me demande donc si vous faites pareil ou pas.

Si tu as énormément de pages à mettre en cache je te conseil de le mettre dans un dossier couplé avec des sous-dossiers, sinon tu risques de faire sauter ton FileSystem

C'est bien ce que je me dis. Tu crée tes sous-dossiers à la main ou tu laisse ton script de cache le faire ?


Ce que moi je fait pour l'instant c'est qqchose comme ça :

Sur ma page qui contient des données à mettre en cache :

Code:
(...)

$fcache = '/home/adresse_de_mon_fichier/';

if( fichierCacheARenouveller($fcache,'file_exists') ){

   ob_start();


  // instructions bla bla (...)


  $cache = ob_get_contents();
  ob_end_flush();
  $fo = fopen($fcache, "w+");
  fwrite($fo,$cache);
  close($fo);
}
else{
  include ($fcache);
}

et ma fonction :

Code:
function fichierCacheARenouveller($fichierCache,$duree){
		if($duree == 'daily' )	     return !file_exists($fichierCache) OR date('N',filemtime($fichierCache)) != date('N'); // cache à renouveller tous les jours
		if($duree == 'file_exists')  return !file_exists($fichierCache); // cache à créer s'il n'existe pas
		if(substr($duree,-1) == 'm') return !file_exists($fichierCache) OR filemtime($fichierCache) < ( time() - 60*substr($duree,0,-1) ); // cache à renouveller toutes les X minutes
}

Je trouve ça plutôt pratique mais du coup ce que j'aime moins c'est que je dois renseigner une adresse à chaque fois pour le fichier cache. Pour l'instant je ne peux pas prendre le $_SERVER['REQUEST_URI'] pour générer automatiquement une adresse de cache car sur certaines pages, je générè plusieurs fichiers caches.
Par exemple si sur ma page d'accueil, j'ai les dernières discus du forum ( 1er cache ) et l'agenda de la semaine ( 2ième cache ). Du coup, lorsque un post est rajouté sur le forum, seul le 1er cache est supprimé. Est-ce que c'est la bonne solution ou autant juste mettre en cache toute la page en un fichier ?

Merci de vos avis, ça me permet aussi de réfléchir en écrivant tout ceci :)
 
WRInaute discret
Koxin-L a dit:
gestion de cache ?
C'est quoi ça ?
Ah oui, c'est vrai, j'ai pas encore 10 000 vu/j sur mon site...

J'en suis loin mais bon pourquoi pas commencer dès maintenant et faire ça bien dès le début au lieu de (éventuellement :p ) avoir besoin de le faire plus tard à l'arrache :)
 
WRInaute discret
J'avais pas pensé au problème du nombre de fichiers dans un répertoire, n'ayant même pas une centaine de pages en cache.

@Chacho
Ca dépend des pages, si une page présente un contenu qui évolue très vite et qui doit toujours être à jour, l'utilisation du cache s'envisage même pas.

Mettre tout une page en html c'est bien si le contenu de la page n'évolue que de temps en temps...
Faire plusieurs caches différents pour une même page je trouve que c'est une bonne solution, ça permet de cibler le raffraichissement du cache, en fonction du besoin de tel ou tel module.
 
WRInaute passionné
A ce propos, on peut avoir combien de fichiers dans un répertoire sans que cela pose un réel problème avec une recherche ??

Je pensais que la fonction « travaillait » comme un humain ; ordre alphabétique non ?
 
WRInaute discret
Elvis a dit:
Faire plusieurs caches différents pour une même page je trouve que c'est une bonne solution, ça permet de cibler le raffraichissement du cache, en fonction du besoin de tel ou tel module.

C'est bien ce que je fais pour le moment mais tu vois du coup je suis obligé de rentrer moi-même un nom de fichier pour chaque partie de la page à mettre en cache séparément.
Alors que si je mets toute la page en 1 cache, je peux utiliser le nom de l'URL pour générer automatiquement un nom de fichier cache.
Mais bon de tte façon, je préfère plusieurs caches par page, comme ça je peux gérer leur régénération indépendamment de manière automatique avec la fonction fichierCacheARenouveller. Si qqun voit comment générer un nom du fichier automatiquement pour chaque cache d'une même page, je suis preneur :D AMA, c'est mort, il faudrait combiner l'url demandé avec un identifiant qu'on donnerait manuellement.
 
WRInaute discret
Le nom de tes fichiers cache tu les rentres plus ou moins à la main une première fois, la même fois où tu implémentes tes fonctions là où tu en as besoin mais après t'es tranquille.

Sinon, si c'est trop casse-c**** de tout rentrer à la main, tu peux aussi attribuer un numero automatique à chaque partie d'une page que tu mets en cache en utilisant une variable statique que tu incrémenterais à chaque appel de ta fonction de mise en cache.

Je pense que ça peut marcher, mais je pense aussi qu'il vaut mieux prendre le soin de nommer explicitement ce qu'on met en cache dans une page pour pouvoir le réutiliser autre part.
 
WRInaute discret
Ouais, je pense pour l'instant ( comme personne d'autre n'a pour l'instant apporté d'idée) que pour éviter trop de fichers dans le répertoire cache, qu'il faut combiner l'URL demandée qu'on utilise pour recréer l'arbo à l'intérieur du dossier cache et un nom donné manuellement pour pouvoir avoir plusieurs fichiers caches par page
 
WRInaute occasionnel
Dans ma réponse, c'est partiellement donné. (un peu caché ok, j'avoue).

exemple :

request uri = /fr/products/video.html
md5 = 274f75a9d303a08c295b318c959bd473
emplacement cache =
/home/cache/27/4f/274f75a9d303a08c295b318c959bd473

la repartition des md5 fait que statistiquement les differents noeuds de l'arboresence cache auront des populations (nb de fichiers) bien reparties, alors que diviser par l'url creera des gros repertoires et des petits.
 
WRInaute discret
Mais si j'ai plusieurs caches par pages et donc par request_uri comment je fais pour créer plusieurs id automatiquement ? Voila mon pb..
 
WRInaute accro
Chaco, tes modules mis en cache sont aléatoires? Ou alors ce sont toujours les mêmes, mais associés à des pages différentes ?
 
WRInaute discret
Pour le moment, sur mon www, une page peut être composé ainsi :
Une partie que je mets en cache et qui n'est régénérée que quand je supprime ce cache ou s'il est supprimé automatiquement par une autre page.
Une partie qui est mis en cache et maj ttes les heures..
etc

Donc comme j'ai des partie que je souhaites mettre à jour à des intervalles différents ( 1h, 1jour, tant qu'une fonction php ne le demande pas etc ), je me suis dis autant faire plusieurs caches soit un cache par partie/module.

Bon pour prendre un exemple concret sinon je sais pas si je vais réussis à expliquer, sur la page d'accueil de mon www il y a :
le module "Forum Live" avec les derniers messages qui constitue un fichier cache qui est renouvellé seulement qqun poste/édite un message.
le module 'Tendance city" qui est mis en cache et renouvelé toutes les heures.
le module "agenda de la semaine" régénéré toutes les semaines etc..

Donc du coup, j'ai mis ces modules dans des fichier caches différents. Ca m'évite de mettre la page en entier dans un seul fichier cache et de devoir le renouveler entièrement toutes les heures alors que seule "tendance city" le nécéssite.

Comme j'ai plusieurs caches par page, je ne peux utiliser l'URL pour générer automatiquement un nom de fichier cache car j'ai plusieurs fichiers caches à nommer. Pour l'instant, je suis obligé de donner un nom manuellement à chaque cache comme je l'ai posté vers le début de ce topic
 
WRInaute passionné
Je pense aussi à utiliser une technique de mise en cache pour la suite car aujourd'hui je n'ai pas encore de limites au niveau des ressources.

Un truc tout con qui m'empêcherait de mettre la page entière en cache est la gestion de la rotation des régies.

Si je génère en dur dans le cache une page, elle aura toujours le même tag d'annonces.

Donc dans ce cas je suis obligé de fragmenter le cache à certain blocs du site et non toute la page.

Vous n'avez pas ce soucis à gérer de votre coté ?
 
WRInaute accro
Chacho a dit:
Comme j'ai plusieurs caches par page, je ne peux utiliser l'URL pour générer automatiquement un nom de fichier cache car j'ai plusieurs fichiers caches à nommer. Pour l'instant, je suis obligé de donner un nom manuellement à chaque cache comme je l'ai posté vers le début de ce topic
tu peut éventuellement stocker tes différentes partie du cache en te basant quand même sur l'URL mais en les écrivant dans des dossier différents sur le filesystem. (cache-live, cache-tendance et cache-agenda par exemple)
 
WRInaute discret
zeb, le problème est le même puisque dans ta solution il faut au préalable identifier les caches, en l'occurence avec le nom du répertoire et que chacho voudrait que ça se fasse tout seul.

Ca pourrait se faire tout seul avec l'utilisation d'une variable statique qui s'incrémenterait à chaque utilisation de ta fonction de cache au sein d'une même page. L'inconvénient c'est qu'on ne peut pas identifier les caches de façon fiable et donc pas les réutiliser autre part.

Sinon Dorian, je pense pas qu'on puisse faire autrement quand on a pas besoin de tout mettre en cache ( ou plutôt besoin de pas tout mettre en cache :) ).
 
WRInaute discret
Oui, à part ta solution Elvis ( à laquelle je n'avais pas pensé d'ailleurs :D ) je ne vois pas d'autre mais bon en même tant ce n'est pas si dramatique que ça comme il ne s'agit que de renseigner une variable la première fois et après ça se fait tout seul. C'est pas si terrible faute de mieux.
J'en suis arrivé à ça :
Recréer une arbo grâce à l'URL et rajouter un identifiant manuellement à chaque partie de la page mis en cache séparément.

Pour l'instant, mes fichiers caches se trouve dans le même dossier que la page d'origine. Qu'est-ce qui justifierait de les regrouper dans un dossier cache et d'y recréer l'arbo ensuite ?
Je voudrais aussi revenir à ma 2ième question, comment gérer vous votre cache une fois crée ? Créez-vous des fonctions pour effacer le cache ou comment ?
 
WRInaute discret
Perso je m'étais fait une petite classe que je peux te donner si ça t'intéresse.

Elle gère le temps de raffraichissement du cache, le caching de pages avec des arguments dans l'URL. exemple : news.php?id=3.
Elle permet aussi de raffraichir une page en ajoutant un argument dans l'url. Exemple : news.php?raffraichir_cache

Je crois que dans le temps j'avais besoin que la suppression s'abatte sur plusieurs fichiers.. Ah oui, c'est parce que j'avais une pagination dans une des parties de mon site, donc quand je rajoutais un enregistrement dans la base, fallait raffraichir la page 1, 2, 3 etc...
 
Discussions similaires
Haut