source: spip-zone/_plugins_/cache/trunk/inc/cache_api.php @ 113750

Last change on this file since 113750 was 113750, checked in by root, 3 months ago

Corriger partout c'est mieux !

  • Property svn:eol-style set to native
File size: 12.8 KB
Line 
1<?php
2/**
3 * Ce fichier contient les fonctions d'API du plugin Cache Factory.
4 *
5 * @package SPIP\CACHE\API
6 */
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9}
10
11
12/**
13 * Ecrit un contenu dans un cache spécifié par son identifiant.
14 *
15 * @api
16 *
17 * @uses cache_configuration_lire()
18 * @uses cache_cache_configurer()
19 * @uses cache_cache_nommer()
20 *
21 * @param string        $plugin
22 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
23 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
24 * @param array|string  $cache
25 *        Identifiant du cache sous la forme d'une chaine (le chemin du fichier) ou d'un tableau fournissant
26 *        les composants canoniques du nom.
27 * @param array|string  $contenu
28 *        Contenu sous forme de tableau à sérialiser ou sous la forme d'une chaine.
29 *
30 * @return bool
31 *         True si l'écriture s'est bien passée, false sinon.
32 */
33function cache_ecrire($plugin, $cache, $contenu) {
34
35        // Initialisation du retour de la fonction
36        $cache_ecrit = false;
37       
38        // Lecture de la configuration des caches du plugin.
39        // Si celle-ci n'existe pas encore elle est créée (cas d'un premier appel).
40        static $configuration = array();
41        if (empty($configuration[$plugin]) and (!$configuration[$plugin] = cache_configuration_lire($plugin))) {
42                $configuration[$plugin] = cache_cache_configurer($plugin);
43        }
44       
45        // Le cache peut-être fourni soit sous la forme d'un chemin complet soit sous la forme d'un
46        // tableau permettant de calculer le chemin complet. On prend en compte ces deux cas.
47        $fichier_cache = '';
48        if (is_array($cache)) {
49                // Création du répertoire du cache à créer, si besoin.
50                if (!empty($cache['sous_dossier'])) {
51                        // Si le conteneur nécessite un sous-dossier, appelé service dans l'identifiant du conteneur.
52                        sous_repertoire($configuration[$plugin]['dossier_base'], rtrim($cache['sous_dossier'], '/'));
53                }
54
55                // Détermination du chemin du cache :
56                // - le nom sans extension est construit à partir des éléments fournis sur le conteneur et
57                //   de la configuration du nom pour le plugin.
58                $fichier_cache = cache_cache_nommer($plugin, $cache, $configuration[$plugin]);
59        } elseif (is_string($cache)) {
60                // Le chemin complet du fichier cache est fourni. Aucune vérification ne peut être faite
61                // il faut donc que l'appelant ait utilisé l'API cache_existe() pour calculer le fichier au préalable.
62                $fichier_cache = $cache;
63        }
64       
65        if ($fichier_cache) {
66                // Suivant que la configuration demande un sérialisation ou pas, on vérife le format du contenu
67                // de façon à toujours écrire une chaine.
68                $contenu_cache = '';
69                if ($configuration[$plugin]['serialisation']) {
70                        if (!is_array($contenu)) {
71                                $contenu_cache = $contenu_cache ? array($contenu_cache) : array();
72                        }
73                        $contenu_cache = serialize($contenu_cache);
74                } else {
75                        if (is_string($contenu)) {
76                                $contenu_cache = $contenu;
77                        }
78                }
79
80                // Ecriture du fichier cache sécurisé ou pas suivant la configuration.
81                include_spip('inc/flock');
82                $ecrire = 'ecrire_fichier';
83                if ($configuration[$plugin]['securisation']) {
84                        $ecrire = 'ecrire_fichier_securise';
85                }
86                $cache_ecrit = $ecrire($fichier_cache, $contenu_cache);
87        }
88       
89        return $cache_ecrit;
90}
91
92
93/**
94 * Lit le cache spécifié par son identifiant et renvoie le contenu sous forme de tableau
95 * ou de chaine éventuellement vide.
96 *
97 * @api
98 *
99 * @uses cache_configuration_lire()
100 * @uses cache_cache_configurer()
101 * @uses cache_cache_nommer()
102 *
103 * @param string        $plugin
104 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
105 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
106 * @param array|string  $cache
107 *        Identifiant du cache sous la forme d'une chaine (le chemin du fichier) ou d'un tableau fournissant
108 *        les composants canoniques du nom.
109 *
110 * @return array|string|bool
111 *        Contenu du fichier sous la forme d'un tableau, d'une chaine ou false si une erreur s'est produite.
112 */
113function cache_lire($plugin, $cache) {
114
115        // Initialisation du contenu du cache
116        $cache_lu = false;
117       
118        // Lecture de la configuration des caches du plugin.
119        // Si celle-ci n'existe pas encore elle est créée (cas d'un premier appel, peu probable pour une lecture).
120        static $configuration = array();
121        if (empty($configuration[$plugin]) and (!$configuration[$plugin] = cache_configuration_lire($plugin))) {
122                $configuration[$plugin] = cache_cache_configurer($plugin);
123        }
124
125        // Le cache peut-être fourni soit sous la forme d'un chemin complet soit sous la forme d'un
126        // tableau permettant de calculer le chemin complet. On prend en compte ces deux cas.
127        $fichier_cache = '';
128        if (is_array($cache)) {
129                // Détermination du chemin du cache :
130                // - le nom sans extension est construit à partir des éléments fournis sur le conteneur et
131                //   de la configuration du nom pour le plugin.
132                $fichier_cache = cache_cache_nommer($plugin, $cache, $configuration[$plugin]);
133        } elseif (is_string($cache)) {
134                // Le chemin complet du fichier cache est fourni. Aucune vérification ne peut être faite
135                // il faut donc que l'appelant ait utilisé l'API cache_existe() pour calculer le fichier au préalable.
136                $fichier_cache = $cache;
137        }
138
139        // Détermination du nom du cache en fonction du plugin appelant et du type
140        if ($fichier_cache) {
141                // Lecture du fichier cache sécurisé ou pas suivant la configuration.
142                include_spip('inc/flock');
143                $lire = 'lire_fichier';
144                if ($configuration[$plugin]['securisation']) {
145                        $lire = 'lire_fichier_securise';
146                }
147                $contenu_cache = '';
148                $lecture_ok = $lire($fichier_cache, $contenu_cache);
149               
150                if ($lecture_ok) {
151                        if ($configuration[$plugin]['serialisation']) {
152                                $cache_lu = unserialize($contenu_cache);
153                        } else {
154                                $cache_lu = $contenu_cache;
155                        }
156                }
157        }
158
159        return $cache_lu;
160}
161
162
163/**
164 * Teste l'existence d'un cache sur le disque et, si il existe, renvoie le chemin complet.
165 *
166 * @api
167 *
168 * @uses cache_configuration_lire()
169 * @uses cache_cache_configurer()
170 * @uses cache_cache_nommer()
171 *
172 * @param string        $plugin
173 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
174 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
175 * @param array|string  $cache
176 *        Identifiant du cache sous la forme d'une chaine (le chemin du fichier) ou d'un tableau fournissant
177 *        les composants canoniques du nom.
178 *
179 * @return string
180 */
181function cache_existe($plugin, $cache) {
182
183        // Lecture de la configuration des caches du plugin.
184        // Si celle-ci n'existe pas encore elle est créée (cas d'un premier appel).
185        static $configuration = array();
186        if (empty($configuration[$plugin]) and (!$configuration[$plugin] = cache_configuration_lire($plugin))) {
187                $configuration[$plugin] = cache_cache_configurer($plugin);
188        }
189
190        // Le cache peut-être fourni soit sous la forme d'un chemin complet soit sous la forme d'un
191        // tableau permettant de calculer le chemin complet. On prend en compte ces deux cas.
192        $fichier_cache = '';
193        if (is_array($cache)) {
194                // Détermination du chemin du cache :
195                // - le nom sans extension est construit à partir des éléments fournis sur le conteneur et
196                //   de la configuration du nom pour le plugin.
197                $fichier_cache = cache_cache_nommer($plugin, $cache, $configuration[$plugin]);
198        } elseif (is_string($cache)) {
199                // Le chemin complet du fichier cache est fourni. Aucune vérification ne peut être faite
200                // il faut donc que l'appelant ait utilisé l'API cache_existe() pour calculer le fichier au préalable.
201                $fichier_cache = $cache;
202        }
203
204        // Vérifier l'existence du fichier.
205        if ($fichier_cache) {
206                if (!file_exists($fichier_cache)) {
207                        $fichier_cache = '';
208                }
209        }
210
211        return $fichier_cache;
212}
213
214
215/**
216 * Renvoie le chemin complet du cache sans tester son existence.
217 * Cette fonction est une encapsulation du service cache_cache_nommer().
218 *
219 * @api
220 *
221 * @uses cache_configuration_lire()
222 * @uses cache_cache_configurer()
223 * @uses cache_cache_nommer()
224 *
225 * @param string $plugin
226 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
227 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
228 * @param array  $cache
229 *        Identifiant du cache sous la forme d'un tableau fournissant les composants canoniques du nom.
230 *
231 * @return string
232 */
233function cache_nommer($plugin, $cache) {
234
235        // Lecture de la configuration des caches du plugin.
236        // Si celle-ci n'existe pas encore elle est créée (cas d'un premier appel).
237        static $configuration = array();
238        if (empty($configuration[$plugin]) and (!$configuration[$plugin] = cache_configuration_lire($plugin))) {
239                $configuration[$plugin] = cache_cache_configurer($plugin);
240        }
241
242        // Le cache est toujours fourni sous la forme d'un tableau permettant de calculer le chemin complet.
243        $fichier_cache = '';
244        if (is_array($cache)) {
245                // Détermination du chemin du cache :
246                // - le nom sans extension est construit à partir des éléments fournis sur le conteneur et
247                //   de la configuration du nom pour le plugin.
248                $fichier_cache = cache_cache_nommer($plugin, $cache, $configuration[$plugin]);
249        }
250
251        return $fichier_cache;
252}
253
254
255/**
256 * Supprime le cache spécifié par son identifiant.
257 *
258 * @api
259 *
260 * @uses cache_configuration_lire()
261 * @uses cache_cache_configurer()
262 * @uses cache_cache_nommer()
263 * @uses supprimer_fichier()
264 *
265 * @param string        $plugin
266 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
267 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
268 * @param array|string  $cache
269 *        Identifiant du cache sous la forme d'une chaine (le chemin du fichier) ou d'un tableau fournissant
270 *        les composants canoniques du nom.
271 *
272 * @return bool
273 *         True si la suppression s'est bien passée, false sinon.
274 */
275function cache_supprimer($plugin, $cache) {
276
277        // Initialisation du contenu du cache
278        $cache_supprime = false;
279       
280        // Lecture de la configuration des caches du plugin.
281        // Si celle-ci n'existe pas encore elle est créée (cas d'un premier appel, peu probable pour une lecture).
282        static $configuration = array();
283        if (empty($configuration[$plugin]) and (!$configuration[$plugin] = cache_configuration_lire($plugin))) {
284                $configuration[$plugin] = cache_cache_configurer($plugin);
285        }
286
287        // Le cache peut-être fourni soit sous la forme d'un chemin complet soit sous la forme d'un
288        // tableau permettant de calculer le chemin complet. On prend en compte ces deux cas.
289        $fichier_cache = '';
290        if (is_array($cache)) {
291                // Détermination du chemin du cache :
292                // - le nom sans extension est construit à partir des éléments fournis sur le conteneur et
293                //   de la configuration du nom pour le plugin.
294                $fichier_cache = cache_cache_nommer($plugin, $cache, $configuration[$plugin]);
295        } elseif (is_string($cache)) {
296                // Le chemin complet du fichier cache est fourni. Aucune vérification ne peut être faite
297                // il faut donc que l'appelant ait utilisé l'API cache_existe() pour calculer le fichier au préalable.
298                $fichier_cache = $cache;
299        }
300
301        // Détermination du nom du cache en fonction du plugin appelant et du type
302        if ($fichier_cache) {
303                // Lecture du fichier cache sécurisé ou pas suivant la configuration.
304                include_spip('inc/flock');
305                $cache_supprime = supprimer_fichier($fichier_cache);
306        }
307
308        return $cache_supprime;
309}
310
311
312/**
313 * Supprime le ou les caches spécifiés d'un plugin donné.
314 * A AMELIORER
315 *
316 * @api
317 *
318 * @param string $plugin
319 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
320 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
321 * @param string $nom_cache
322 *        Nom et extension du fichier cache.
323 *
324 * @return void
325 */
326function cache_vider($plugin, $caches = array()) {
327
328        // Initialisation du retour
329        $cache_vide = false;
330
331        if ($caches) {
332                $fichiers_cache = is_string($caches) ? array($caches) : $caches;
333                include_spip('inc/flock');
334                foreach ($fichiers_cache as $_fichier) {
335                        supprimer_fichier($_fichier);
336                }
337                $cache_vide = true;
338        }
339       
340        return $cache_vide;
341}
342
343
344/**
345 * Lit la configuration standard des caches d'un plugin utilisateur.
346 *
347 * @api
348 *
349 * @uses lire_config()
350 *
351 * @param string $plugin
352 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
353 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
354 *
355 * @return array
356 *        Tableau de configuration des caches d'un plugin utilisateur ou tableau vide si aucune configuration n'est encore
357 *        enregistrée.
358 */
359function cache_configuration_lire($plugin) {
360
361        // Initialisation de la configuration à retourner
362        $configuration_lue = array();
363
364        if ($plugin) {
365                // Récupération de la meta du plugin Cache
366                include_spip('inc/config');
367                $configuration_lue = lire_config("cache/${plugin}", array());
368        }
369
370        return $configuration_lue;
371}
Note: See TracBrowser for help on using the repository browser.