Changeset 118445 in spip-zone


Ignore:
Timestamp:
Nov 7, 2019, 1:48:39 PM (11 days ago)
Author:
eric@…
Message:

Ajout d'une option pour décoder le contenu d'un fichier cache lors de la lecture, si la configuration le demande.

Location:
_plugins_/cache/trunk
Files:
4 edited

Legend:

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

    r114453 r118445  
    4646                'securisation'    => false,        // Indicateur de sécurisation du fichier
    4747                'serialisation'   => true,         // Indicateur de sérialisation
     48                'decodage'        => true,         // Permet d'appliquer une fonction de décodage à la lecture qui dépend de l'extension
    4849                'conservation'    => 0             // Durée de conservation du cache en secondes. 0 pour permanent
    4950        );
     
    6364        // La durée est exprimée en secondes.
    6465        $configuration['conservation'] = abs(intval($configuration['conservation']));
     66
     67        // On vérifie que la sérialisation et le décodage sont cohérents:
     68        // - si une sérialisation est demandée, alors le décodage n'est pas possible.
     69        if ($configuration['securisation']) {
     70                $configuration['decodage'] = false;
     71        }
     72
     73        // On vérifie que le décodage est valide et cohérent avec l'extension:
     74        // - on ne peut décoder que des extensions json, xml et yaml.
     75        if ($configuration['decodage']) {
     76                if ((($configuration['extension'] == 'yaml') or ($configuration['extension'] == 'yml'))
     77                and (!defined('_DIR_PLUGIN_YAML'))) {
     78                        $configuration['decodage'] = false;
     79                }
     80        }
    6581
    6682        // On vérifie l'indicateur de sécurisation : si le cache doit être sécurisé alors son extension
     
    267283
    268284/**
     285 * Décode le contenu du fichier cache en fonction de l'extension.
     286 *
     287 * Le plugin Cache Factory utilise des fonctions standard de PHP, SPIP ou du plugin YAML. Un plugin appelant peut
     288 * proposer une fonction spécifique de décodage
     289 *
     290 * @uses cache_chercher_service()
     291 *
     292 * @param string $plugin
     293 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
     294 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
     295 * @param string $contenu
     296 *        Contenu du fichier cache au format chaine.
     297 * @param array  $configuration
     298 *        Configuration complète des caches du plugin utilisateur lue à partir de la meta de stockage.
     299 *
     300 * @return array
     301 *         Contenu du cache décodé si la fonction idoine a été appliqué ou tel que fourni en entrée sinon.
     302 */
     303function cache_cache_decoder($plugin, $contenu, $configuration) {
     304
     305        // Cache Factory décode le contenu du fichier cache en fonction de l'extension (json, yaml, yml ou xml).
     306        $encodage = ltrim($configuration['extension'], '.');
     307
     308        // Le plugin utilisateur peut fournir un service propre pour décoder le contenu du cache.
     309        // Néanmoins, étant donné la généricité du mécanisme offert par le plugin Cache cela devrait être rare.
     310        if ($decoder = cache_chercher_service($plugin, "cache_decoder_${encodage}")) {
     311                $contenu = $decoder($plugin, $contenu);
     312        } else {
     313                // Utilisation des fonctions génériques de Cache Factory
     314                switch ($encodage) {
     315                        case 'json':
     316                                // On utilise la fonction PHP native
     317                                $contenu = json_decode($contenu, true);
     318                                break;
     319                        case 'yaml':
     320                        case 'yml':
     321                                // On utilise la fonction du plugin YAML si il est actif (un jour on l'aura dans SPIP...)
     322                                if (!defined('_DIR_PLUGIN_YAML')) {
     323                                        include_spip('inc/yaml');
     324                                        $contenu = yaml_decode($contenu);
     325                                }
     326                                break;
     327                        case 'xml':
     328                                // On utilise la fonction historique de SPIP sachant qu'il en existe d'autre. Pour changer il suffit
     329                                // d'utiliser une fonction spécifique du plugin appelant.
     330                                include_spip('inc/xml');
     331                                $contenu = spip_xml_parse($contenu, true);
     332                                break;
     333                        default:
     334                }
     335        }
     336
     337        return $contenu;
     338}
     339
     340
     341/**
    269342 * Effectue le chargement du formulaire de vidage des caches pour un plugin utilisateur donné.
    270343 *
  • _plugins_/cache/trunk/inc/cache.php

    r114408 r118445  
    130130        // tableau permettant de calculer le chemin complet. On prend en compte ces deux cas.
    131131        $fichier_cache = '';
     132        include_spip('cache/cache');
    132133        if (is_array($cache)) {
    133134                // Détermination du chemin du cache :
    134135                // - le nom sans extension est construit à partir des éléments fournis sur le conteneur et
    135136                //   de la configuration du nom pour le plugin.
    136                 include_spip('cache/cache');
    137137                $fichier_cache = cache_cache_composer($plugin, $cache, $configuration);
    138138        } elseif (is_string($cache)) {
     
    158158                        } else {
    159159                                $cache_lu = $contenu_cache;
     160                                if ($configuration['decodage']) {
     161                                        $cache_lu = cache_cache_decoder($plugin, $cache_lu, $configuration);
     162                                }
    160163                        }
    161164                }
  • _plugins_/cache/trunk/paquet.xml

    r114484 r118445  
    22        prefix="cache"
    33        categorie="outil"
    4         version="0.3.3"
     4        version="0.4.0"
    55        etat="test"
    66        compatibilite="[3.0.0;3.2.*]"
Note: See TracChangeset for help on using the changeset viewer.