source: spip-zone/_plugins_/taxonomie/trunk/inc/taxonomie_cacher.php @ 113719

Last change on this file since 113719 was 113719, checked in by eric@…, 4 months ago

Mise en cohérence du nom des caches Wikipédia.
Ajout d'une fonction et d'un formulaire de vidage des caches.

  • Property svn:eol-style set to native
File size: 7.3 KB
Line 
1<?php
2/**
3 * Ce fichier contient l'ensemble des constantes et des fonctions de gestion des caches de Taxonomie.
4 *
5 * @package SPIP\TAXONOMIE\CACHE
6 */
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9}
10
11
12if (!defined('_TAXONOMIE_CACHE_NOMDIR')) {
13        /**
14         * Nom du dossier contenant les fichiers caches des éléments de taxonomie
15         *
16         * @package SPIP\TAXONOMIE\CACHE
17         */
18        define('_TAXONOMIE_CACHE_NOMDIR', 'cache-taxonomie/');
19}
20if (!defined('_TAXONOMIE_CACHE_DIR')) {
21        /**
22         * Chemin du dossier contenant les fichiers caches des boussoles
23         *
24         * @package SPIP\TAXONOMIE\CACHE
25         */
26        define('_TAXONOMIE_CACHE_DIR', _DIR_VAR . _TAXONOMIE_CACHE_NOMDIR);
27}
28if (!defined('_TAXONOMIE_CACHE_FORCER')) {
29        /**
30         * Indicateur permettant de forcer le recalcul du cache systématiquement.
31         * A n'utiliser que temporairement en mode debug par exemple.
32         *
33         * @package SPIP\TAXONOMIE\CACHE
34         */
35        define('_TAXONOMIE_CACHE_FORCER', false);
36}
37
38
39/**
40 * Ecrit le contenu issu d'un service taxonomique dans un fichier texte afin d'optimiser le nombre
41 * de requêtes adressées au service.
42 *
43 * @package SPIP\TAXONOMIE\CACHE
44 *
45 * @param string $cache
46 *        Contenu du fichier cache. Si le service appelant manipule un tableau il doit le sérialiser avant
47 *        d'appeler cette fonction.
48 * @param string $service
49 * @param string $action
50 * @param int    $tsn
51 * @param array  $options
52 *
53 * @return boolean
54 *        Toujours à vrai.
55 */
56function cache_taxonomie_ecrire($cache, $service, $action, $tsn, $options) {
57
58        // Création du dossier cache si besoin
59        sous_repertoire(_DIR_VAR, trim(_TAXONOMIE_CACHE_NOMDIR, '/'));
60
61        // Ecriture du fichier cache
62        $fichier_cache = cache_taxonomie_nommer($service, $action, $tsn, $options);
63        ecrire_fichier($fichier_cache, $cache);
64
65        return true;
66}
67
68
69/**
70 * Construit le nom du fichier cache en fonction du service, de l'action, du taxon concernés et
71 * d'autres critères optionnels.
72 *
73 * @package SPIP\TAXONOMIE\CACHE
74 *
75 * @param string $service
76 * @param string $action
77 * @param int    $tsn
78 * @param array  $options
79 *
80 * @return string
81 */
82function cache_taxonomie_nommer($service, $action, $tsn, $options) {
83
84        // Construction du chemin complet d'un fichier cache
85        $fichier_cache = _TAXONOMIE_CACHE_DIR
86                                         . $service
87                                         . ($action ? '_' . $action : '')
88                                         . '_' . $tsn;
89
90        // On complète le nom avec les options éventuelles
91        if ($options) {
92                foreach ($options as $_option => $_valeur) {
93                        if ($_valeur) {
94                                $fichier_cache .= '_' . $_valeur;
95                        }
96                }
97        }
98
99        // On rajoute l'extension texte
100        $fichier_cache .= '.txt';
101
102        return $fichier_cache;
103}
104
105/**
106 * Vérifie l'existence du fichier cache pour un taxon, un service et une actions donnés.
107 * Si le fichier existe la fonction retourne son chemin complet.
108 *
109 * @package SPIP\TAXONOMIE\CACHE
110 *
111 * @param string $service
112 * @param string $action
113 * @param int    $tsn
114 * @param array  $options
115 *
116 * @return string
117 *        Chemin du fichier cache si il existe ou chaine vide sinon.
118 */
119function cache_taxonomie_existe($service, $action, $tsn, $options = array()) {
120
121        // Contruire le nom du fichier cache
122        $fichier_cache = cache_taxonomie_nommer($service, $action, $tsn, $options);
123
124        // Vérification de l'existence du fichier:
125        // - chaine vide si le fichier n'existe pas
126        // - chemin complet du fichier si il existe
127        if (!file_exists($fichier_cache)) {
128                $fichier_cache = '';
129        }
130
131        return $fichier_cache;
132}
133
134
135/**
136 * Supprime tout ou partie des fichiers cache taxonomiques.
137 *
138 * @package SPIP\TAXONOMIE\CACHE
139 *
140 * @param array|string $caches
141 *        Liste des fichiers à supprimer ou vide si tous les fichiers cache doivent être supprimés.
142 *        Il est possible de passer un seul fichier comme une chaine.
143 *
144 * @return boolean
145 *        Toujours à `true`.
146 */
147function cache_taxonomie_supprimer($caches = array()) {
148
149        include_spip('inc/flock');
150
151        if ($caches) {
152                $fichiers_cache = is_string($caches) ? array($caches) : $caches;
153        } else {
154                $fichiers_cache = glob(_TAXONOMIE_CACHE_DIR . '*.*');
155        }
156
157        if ($fichiers_cache) {
158                foreach ($fichiers_cache as $_fichier) {
159                        supprimer_fichier($_fichier);
160                }
161        }
162
163        return true;
164}
165
166/**
167 * Répertorie les fichiers caches issu de l'utilisation de l'API d'un service donné.
168 * La fonction renvoie une description de chaque fichier cache, à savoir, à minima, l'action lancée, le TSN
169 * du taxon concerné et le nom du fichier cache.
170 *
171 * @package SPIP\TAXONOMIE\CACHE
172 *
173 * @param string $service
174 *        Alias en minuscules du service pour lequel on veut lister les caches créés ou chaine vide si on souhaite
175 *        tous les caches sans distinction de service.
176 *
177 * @return array
178 *        Tableau des descriptions des fichiers cache créés par le service indexé par le chemin complet de
179 *        chaque fichier cache.
180 */
181function cache_taxonomie_repertorier($service = '') {
182
183        // Initialisation de la liste des descriptions des caches du service
184        $descriptions_cache = array();
185
186        // Tableau des taxons pour éviter de faire des appels SQL à chaque cache.
187        static $taxons = array();
188
189        // On constitue la liste des services requis par l'appel
190        include_spip('taxonomie_fonctions');
191        $services = taxon_lister_services();
192        if ($service) {
193                if (array_key_exists($service, $services)) {
194                        $services = array($service => $services[$service]);
195                } else {
196                        $services = array();
197                }
198        }
199
200        if ($services) {
201                foreach ($services as $_service => $_titre) {
202                        // Récupération des fichiers cache du service.
203                        $pattern_cache = _TAXONOMIE_CACHE_DIR . $_service . '_*.txt';
204                        $fichiers_cache = glob($pattern_cache);
205
206                        if ($fichiers_cache) {
207                                foreach ($fichiers_cache as $_fichier_cache) {
208                                        // On raz la description pour éviter de garder des éléments du cache précédent et on initialise avec
209                                        // le nom du fichier qui peut servir d'id, le chemin complet et le service.
210                                        $description = array();
211                                        $description['nom_cache'] = basename($_fichier_cache, '.txt');
212                                        $description['fichier_cache'] = $_fichier_cache;
213                                        $description['service'] = $_service;
214
215                                        // On extrait le service qui sert toujours d'index principal du tableau
216                                        $description['service'] = $_service;
217                                        $description['titre_service'] = $_titre;
218
219                                        // On décompose le nom pour récupérer l'action et le TSN correspondant ainsi que la langue.
220                                        // Le nom du fichier est composé d'éléments séparés par un underscore. La structure est toujours
221                                        // composée dans l'ordre du service, de l'action et du TSN et peut être complétée par la langue.
222                                        $elements = explode('_', $description['nom_cache']);
223                                        $description['action'] = $elements[1];
224                                        $description['tsn'] = intval($elements[2]);
225                                        if (isset($elements[3])) {
226                                                $description['langue'] = $elements[3];
227                                        }
228
229                                        // On rajoute le nom scientifique du taxon pour un affichage plus compréhensible
230                                        if (!isset($taxons[$description['tsn']])) {
231                                                // Si pas encore stocké, on cherche le nom scientifique du taxon et on le sauvegarde.
232                                                $where = array('tsn=' . $description['tsn']);
233                                                $taxons[$description['tsn']] = sql_getfetsel('nom_scientifique', 'spip_taxons', $where);
234                                        }
235                                        $description['nom_scientifique'] = $taxons[$description['tsn']];
236
237
238                                        // On structure le tableau par service.
239                                        $descriptions_cache[$_service]['titre_service'] = $_titre;
240                                        $descriptions_cache[$_service]['caches'][] = $description;
241                                }
242                        }
243                }
244        }
245
246        return $descriptions_cache;
247}
Note: See TracBrowser for help on using the repository browser.