[spip-dev] Mettre find_in_path en cache permanent

Bonjour,

Fil m'ayant lancé un défi sur IRC, je viens en discuter ici.
Je voudrais mettre en place un système de cache pour find_in_path
Pourquoi ?
Parce qu'avec une dizaine de plugins installés, pour afficher une page déjà en cache, SPIP fait 30 appels à find_in_path qui génèrent 60 recherches de fichiers infructueuses.

Donc, les pistes :
tout comme meta_cache.txt, avoir un fichier find_in_path_cache.txt ou .php
Ce fichier contiendrait :
- soit les chemins des fichiers sérialisés
- soit carrément le php du tableau associatif, fichier/chemin (mais c'est peut-être un peu risqué ?)

Ce fichier serait effacé :
- lorsqu'on vide le cache
- lorsqu'on installe ou désinstalle un plugin

Et la fonction find_in_path modifiée pour :
- chercher comme actuellement en RAM si le fichier cherché est connu
- à défaut chercher via ce cache
- et si pas dans ce cache, modification du fichier (avec spip_flock pour gérer les conflits)

Est-ce que j'ai oublié quelque chose ?

Je ne suis pas certain:
Lorsqu'on modifie la structure de «squelettes»?

Par exemple, si on ajoute un fichier /squelettes/formulaires/login.html, est-ce qu'il y a un risque qu'il ne le repère pas?

A*

Fil m'ayant lancé un défi sur IRC, je viens en discuter ici.

Chevalier, je n'ai rien fait de tel : j'ai juste dit "envoie un
patch", ça n'a rien d'un défi.

-- Fil

* Martin Arnaud tapuscrivait, le 19/06/2008 12:37:

Ce fichier serait effacé :
- lorsqu'on vide le cache
- lorsqu'on installe ou désinstalle un plugin

Je ne suis pas certain:
Lorsqu'on modifie la structure de «squelettes»?

Par exemple, si on ajoute un fichier /squelettes/formulaires/login.html, est-ce qu'il y a un risque qu'il ne le repère pas?

Oui, tout à fait.
Mais justement, quand tu mets un nouveau squelette, c'est logique de vider le cache, non ?

* Fil tapuscrivait, le 19/06/2008 12:52:

Fil m'ayant lancé un défi sur IRC, je viens en discuter ici.

Chevalier, je n'ai rien fait de tel : j'ai juste dit "envoie un
patch", ça n'a rien d'un défi.

Bon, OK, le défi est dans ma tête :wink:

et tu as quantifié le cout en perfo ?

non, il n'est heureusement pas nécessaire de vider le cache a chaque fichier créé !
Cédric

Est-ce que j'ai oublié quelque chose ?

Un mode 'plugin en développement' qui ne tiendrait pas compte de ce fichier
?

* cedric.morin@yterium.com tapuscrivait, le 19/06/2008 12:57:

non, il n'est heureusement pas nécessaire de vider le cache a chaque fichier créé !

Bien sûr, mais lorsqu'on sait que ce que l'on fait est un gros changement, c'est bien utile de pouvoir vider le cache.
Et j'ai déjà eu le cas avec des <INCLURE> #INCLURE et #MODELE où un var_mode=recalcul ne suffisait pas...

* RealET tapuscrivait, le 19/06/2008 11:47:

Bonjour,

Fil m'ayant lancé un défi sur IRC, je viens en discuter ici.
Je voudrais mettre en place un système de cache pour find_in_path
Pourquoi ?
Parce qu'avec une dizaine de plugins installés, pour afficher une page déjà en cache, SPIP fait 30 appels à find_in_path qui génèrent 60 recherches de fichiers infructueuses.

Donc, les pistes :
tout comme meta_cache.txt, avoir un fichier find_in_path_cache.txt ou .php
Ce fichier contiendrait :
- soit les chemins des fichiers sérialisés
- soit carrément le php du tableau associatif, fichier/chemin (mais c'est peut-être un peu risqué ?)

Ce fichier serait effacé :
- lorsqu'on vide le cache
- lorsqu'on installe ou désinstalle un plugin

Et la fonction find_in_path modifiée pour :
- chercher comme actuellement en RAM si le fichier cherché est connu
- à défaut chercher via ce cache
- et si pas dans ce cache, modification du fichier (avec spip_flock pour gérer les conflits)

Est-ce que j'ai oublié quelque chose ?

Voici déjà un patch permettant de journaliser ce que trouve ou pas find_in_path.
Du coup, je me lance dans l'optimisation de quelques plugins.

Marcimat, je constate que cfg a pas mal de find_in_path pour ses propres fichiers :
inc/cfg_config.php
balise/cfg_arbo.php
balise/cfg_config.php

Est-ce bien nécessaire de faire find_in_path pour ces fichiers ?

* RealET tapuscrivait, le 20/06/2008 22:50:

Voici déjà un patch permettant de journaliser ce que trouve ou pas find_in_path.

Avec le fichier, ce sera mieux.

log_find_in_path.patch (734 Bytes)