Changeset 113830 in spip-zone


Ignore:
Timestamp:
Feb 9, 2019, 7:41:18 PM (11 days ago)
Author:
eric@…
Message:

Ajout de paramètres de configuration des caches et utilisation dans les API.
Ajout de l'API cache_repertorier().

Location:
_plugins_/cache/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/cache/trunk/cache/cache.php

    r113804 r113830  
    3939        // Initialisation du tableau de configuration avec les valeurs par défaut du plugin Cache.
    4040        $configuration_defaut = array(
    41                 'racine'        => _DIR_CACHE,
    42                 'nom'           => array('nom'),
    43                 'extension'     => '.txt',
    44                 'securisation'  => false,
    45                 'serialisation' => true,
    46                 'separateur'    => '_'
     41                'racine'          => _DIR_CACHE,
     42                'sous_dossier'    => false,
     43                'nom_obligatoire' => array('nom'),
     44                'nom_facultatif'  => array(),
     45                'extension'       => '.txt',
     46                'securisation'    => false,
     47                'serialisation'   => true,
     48                'separateur'      => '_'
    4749        );
    4850
     
    7678                $configuration['racine'] = rtrim($configuration['racine'], '/') . '/';
    7779        }
     80
    7881        // -- Sous-dossier spécifique au plugin
    7982        $sous_dossier = ($configuration['racine'] == _DIR_VAR) ? "cache-${plugin}" : "$plugin";
     
    8184        include_spip('inc/flock');
    8285        $configuration['dossier_base'] = sous_repertoire($configuration['racine'], $sous_dossier);
    83        
     86
     87        // -- Construction du tableau des composants du nom : dans l'ordre on a toujours les composants obligatoires
     88        //    suivis des composants faclutatifs.
     89        $configuration['nom'] = array_merge($configuration['nom_obligatoire'], $configuration['nom_facultatif']);
     90
    8491        // Enregistrement de la configuration du plugin utilisateur dans la meta prévue.
    8592        // Si une configuration existe déjà on l'écrase.
     
    123130                // de base des caches du plugin.
    124131                $dir_cache = $configuration['dossier_base'];
    125                 if (!empty($cache['sous_dossier'])) {
    126                         // Si le cache nécessite un sous-dossier, appelé service dans l'identifiant du cache.
    127                         $dir_cache .= rtrim($cache['sous_dossier'], '/') . '/';
     132                if ($configuration['sous_dossier']) {
     133                        if (!empty($cache['sous_dossier'])) {
     134                                // Si le cache nécessite un sous-dossier, appelé service dans l'identifiant du cache.
     135                                $dir_cache .= rtrim($cache['sous_dossier'], '/') . '/';
     136                        } else {
     137                                // C'est une erreur, le sous-dossier n'a pas été fourni alors qu'il est requis.
     138                                $dir_cache = '';
     139                        }
    128140                }
    129141
     
    132144                // fournie par le plugin (liste ordonnée de composant).
    133145                $nom_cache = '';
    134                 foreach ($configuration['nom'] as $_composant) {
    135                         if (isset($cache[$_composant])) {
    136                                 $nom_cache .= ($nom_cache ? $configuration['separateur'] : '') . $cache[$_composant];
     146                if ($dir_cache) {
     147                        foreach ($configuration['nom'] as $_composant) {
     148                                if (isset($cache[$_composant])) {
     149                                        $nom_cache .= ($nom_cache ? $configuration['separateur'] : '') . $cache[$_composant];
     150                                }
    137151                        }
    138152                }
     
    204218
    205219
     220/**
     221 * Complète la description canonique d'un cache.
     222 *
     223 * Le plugin Cache Factory ne complète pas la description canonique.
     224 *
     225 * @uses cache_chercher_service()
     226 *
     227 * @param string $plugin
     228 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
     229 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
     230 * @param array  $cache
     231  *       Tableau identifiant le cache pour lequel on veut construire le nom.
     232 * @param array  $configuration
     233 *        Configuration complète des caches du plugin utlisateur lue à partir de la meta de stockage.
     234 *
     235 * @return array
     236 *         Description du cache complétée par un ensemble de données propres au plugin.
     237 */
     238function cache_cache_completer($plugin, $cache, $configuration) {
     239
     240        // Le plugin utilisateur peut fournir un service propre pour construire le chemin complet du fichier cache.
     241        // Néanmoins, étant donné la généricité du mécanisme offert par le plugin Cache cela devrait être rare.
     242        if ($completer = cache_chercher_service($plugin, 'cache_completer')) {
     243                // On passe le plugin appelant à la fonction car cela permet ainsi de mutualiser les services de stockage.
     244                $cache = $completer($plugin, $cache, $configuration);
     245        }
     246
     247        return $cache;
     248}
     249
     250
    206251// -----------------------------------------------------------------------
    207252// ----------------- UTILITAIRE PROPRE AU PLUGIN CACHE -------------------
  • _plugins_/cache/trunk/inc/cache.php

    r113781 r113830  
    5050        if (is_array($cache)) {
    5151                // Création du répertoire du cache à créer, si besoin.
    52                 if (!empty($cache['sous_dossier'])) {
    53                         // Si le conteneur nécessite un sous-dossier, appelé service dans l'identifiant du conteneur.
    54                         sous_repertoire($configuration[$plugin]['dossier_base'], rtrim($cache['sous_dossier'], '/'));
    55                 }
    56 
    57                 // Détermination du chemin du cache :
     52                $erreur_sous_dossier = false;
     53                if ($configuration[$plugin]['sous_dossier']) {
     54                        if (!empty($cache['sous_dossier'])) {
     55                                // Si le cache nécessite un sous-dossier on crée le répertoire au besoin.
     56                                sous_repertoire($configuration[$plugin]['dossier_base'], rtrim($cache['sous_dossier'], '/'));
     57                        } else {
     58                                // C'est une erreur, le sous-dossier n'a pas été fourni alors qu'il est requis. On arrête l'écriture.
     59                                $erreur_sous_dossier = true;
     60                        }
     61                }
     62
     63                // Détermination du chemin du cache si pas d'erreur sur le sous-dossier :
    5864                // - le nom sans extension est construit à partir des éléments fournis sur le conteneur et
    5965                //   de la configuration du nom pour le plugin.
    60                 $fichier_cache = cache_cache_composer($plugin, $cache, $configuration[$plugin]);
     66                if (!$erreur_sous_dossier) {
     67                        $fichier_cache = cache_cache_composer($plugin, $cache, $configuration[$plugin]);
     68                }
    6169        } elseif (is_string($cache)) {
    6270                // Le chemin complet du fichier cache est fourni. Aucune vérification ne peut être faite
     
    316324
    317325/**
    318  * Supprime le ou les caches spécifiés d'un plugin donné.
    319  * A AMELIORER
     326 * Retourne la description complète des caches d'un plugin filtrés sur une liste de critères.
     327 *
     328 * @api
     329 *
     330 * @uses cache_configuration_lire()
     331 * @uses cache_cache_configurer()
     332 * @uses cache_cache_composer()
     333 * @uses cache_cache_decomposer()
     334 * @uses cache_cache_completer()
     335 *
     336 * @param string       $plugin
     337 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
     338 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
     339 * @param array $filtres
     340 *        Tableau associatif `[champ] = valeur` ou `[champ] = !valeur` de critères de filtres sur les composants
     341 *        de caches. Les opérateurs égalité et inégalité sont possibles.
     342 *
     343 * @return array
     344 *        Tableau des descriptions des fichiers cache créés par le plugin indexé par le chemin complet de
     345 *        chaque fichier cache.
     346 */
     347function cache_repertorier($plugin, $filtres = array()) {
     348
     349        // Initialisation de la liste des caches
     350        $caches = array();
     351
     352        // Lecture de la configuration des caches du plugin.
     353        // Si celle-ci n'existe pas encore elle est créée (cas d'un premier appel, peu probable pour une lecture).
     354        static $configuration = array();
     355        include_spip('cache/cache');
     356        if (empty($configuration[$plugin]) and (!$configuration[$plugin] = cache_configuration_lire($plugin))) {
     357                $configuration[$plugin] = cache_cache_configurer($plugin);
     358        }
     359
     360        // Rechercher les caches du plugin sans appliquer de filtre si ce n'est sur le sous-dossier éventuellement.
     361        // Les autres filtres seront appliqués sur les fichiers récupérés.
     362        $pattern_fichier = $configuration[$plugin]['dossier_base'];
     363        if ($configuration[$plugin]['sous_dossier']) {
     364                if (array_key_exists('sous_dossier', $filtres)) {
     365                        $pattern_fichier .= rtrim($filtres['sous_dossier'], '/') . '/';
     366                } else {
     367                        $pattern_fichier .= '*/';
     368                }
     369        }
     370
     371        // On complète le pattern avec une recherche d'un nom quelconque mais avec l'extension configurée.
     372        $pattern_fichier .= '*' . $configuration[$plugin]['extension'];
     373
     374        // On recherche les fichiers correspondant au pattern.
     375        $fichiers_cache = glob($pattern_fichier);
     376
     377        if ($fichiers_cache) {
     378                foreach ($fichiers_cache as $_fichier_cache) {
     379                        // On décompose le chemin de chaque cache afin de renvoyer l'identifiant canonique du cache.
     380                        $cache = cache_cache_decomposer($plugin, $_fichier_cache, $configuration[$plugin]);
     381
     382                        // Maintenant que les composants sont déterminés on applique les filtres pour savoir si on
     383                        // complète et stocke le cache.
     384                        $cache_conforme = true;
     385                        foreach ($filtres as $_critere => $_valeur) {
     386                                $operateur_egalite = true;
     387                                $valeur = $_valeur;
     388                                if (substr($_valeur, 0, 1) == '!') {
     389                                        $operateur_egalite = false;
     390                                        $valeur = ltrim($_valeur, '!');
     391                                }
     392                                if (isset($cache[$_critere])
     393                                and (($operateur_egalite and ($cache[$_critere] != $valeur))
     394                                        or (!$operateur_egalite and ($cache[$_critere] == $valeur)))) {
     395                                        $cache_conforme = false;
     396                                        break;
     397                                }
     398                        }
     399
     400                        if ($cache_conforme) {
     401                                // On permet au plugin de completer la description canonique
     402                                $cache = cache_cache_completer($plugin, $cache, $configuration[$plugin]);
     403
     404                                // On stocke la description du fichier cache dans le tableau de sortie.
     405                                $caches[$_fichier_cache] = $cache;
     406                        }
     407                }
     408        }
     409
     410        return $caches;
     411}
     412
     413
     414/**
     415 * Supprime, pour un plugin donné, les caches désignés par leur chemin complet.
    320416 *
    321417 * @api
     
    325421 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
    326422 * @param array  $caches
    327  *        Liste des fichiers caches (chemin complet) à supprimer.
     423 *        Liste des fichiers caches désignés par leur chemin complet.
    328424 *
    329425 * @return bool
     426 *         True si la suppression s'est bien passée, false sinon.
    330427 */
    331428function cache_vider($plugin, $caches) {
Note: See TracChangeset for help on using the changeset viewer.