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

Last change on this file since 113741 was 113741, checked in by root, 4 months ago

Premier jet d'API.
Ca demande encore réflexion.

  • Property svn:eol-style set to native
File size: 8.7 KB
Line 
1<?php
2/**
3 * Ce fichier contient les fonctions d'API de gestion des caches.
4 *
5 * @package SPIP\CACHE\API
6 */
7if (!defined('_ECRIRE_INC_VERSION')) {
8        return;
9}
10
11
12/**
13 * Ecrit un contenu dans le cache spécifié d'un plugin utilisateur.
14 *
15 * @api
16 *
17 * @param string $plugin
18 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
19 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
20 * @param array  $conteneur
21 *        Nom et extension du fichier cache.
22 * @param array  $contenu
23 *        Contenu sous forme de tableau à stocker dans un fichier cache après sérialisation.
24 *
25 * @return bool
26 */
27function cache_ecrire($plugin, $conteneur, $contenu) {
28
29        // Initialisation du retour de la fonction
30        $cache_ecrit = false;
31       
32        // Lecture de la configuration des caches du plugin.
33        // Si celle-ci n'existe pas encore elle est créée (cas d'un premier appel).
34        static $configuration = array();
35        if (!$configuration and (!$configuration = cache_configuration_lire($plugin))) {
36                $configuration = cache_cache_configurer($plugin);
37        }
38       
39        // Création du répertoire du cache à créer, si besoin.
40        if (!empty($conteneur['sous_dossier'])) {
41                // Si le conteneur nécessite un sous-dossier, appelé service dans l'identifiant du conteneur.
42                sous_repertoire($configuration['dossier_base'], rtrim($conteneur['sous_dossier'], '/'));
43        }
44
45        // Détermination du chemin du cache :
46        // - le nom sans extension est construit à partir des éléments fournis sur le conteneur et
47        //   de la configuration du nom pour le plugin.
48        if ($fichier_cache = cache_nommer($plugin, $conteneur, $configuration)) {
49                // Suivant que la configuration demande un sérialisation ou pas, on vérife le format du contenu
50                // de façon à toujours écrire une chaine.
51                $contenu_cache = '';
52                if ($configuration['serialisation']) {
53                        if (!is_array($contenu)) {
54                                $contenu_cache = $contenu_cache ? array($contenu_cache) : array();
55                        }
56                        $contenu_cache = serialize($contenu_cache);
57                } else {
58                        if (is_string($contenu)) {
59                                $contenu_cache = $contenu;
60                        }
61                }
62
63                // Ecriture du fichier cache sécurisé ou pas suivant la configuration.
64                include_spip('inc/flock');
65                $ecrire = 'ecrire_fichier';
66                if ($configuration['securisation']) {
67                        $ecrire = 'ecrire_fichier_securise';
68                }
69                $cache_ecrit = $ecrire($fichier_cache, $contenu_cache);
70        }
71       
72        return $cache_ecrit;
73}
74
75
76/**
77 * Lit la configuration des caches d'un plugin utilisateur.
78 *
79 * @api
80 *
81 * @param string $plugin
82 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
83 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
84 *
85 * @return array
86 *        Tableau de configuration des caches d'un plugin utilisateur ou tableau vide si aucune configuration n'est encore
87 *        enregistrée.
88 */
89function cache_configuration_lire($plugin) {
90
91        // Initialisation de la configuration à retourner
92        $configuration_lue = array();
93
94        if ($plugin) {
95                // Récupération de la meta du plugin Cache
96                include_spip('inc/config');
97                $configuration_lue = lire_config("cache/${plugin}", array());
98        }
99
100        return $configuration_lue;
101}
102
103
104/**
105 * Lit le cache spécifié d'un plugin donné et renvoie le contenu sous forme de tableau
106 * éventuellement vide.
107 *
108 * @api
109 *
110 * @param string $plugin
111 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
112 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
113 * @param string $nom_cache
114 *        Nom et extension du fichier cache.
115 *
116 * @return array|string|bool
117 *        Contenu du fichier sous la forme d'un tableau, d'une chaine ou false si une erreur s'est produite.
118 */
119function cache_lire($plugin, $conteneur) {
120
121        // Initialisation du contenu du cache
122        $cache_lu = false;
123       
124        // Lecture de la configuration des caches du plugin.
125        // Si celle-ci n'existe pas encore elle est créée (cas d'un premier appel, peu probable pour une lecture).
126        static $configuration = array();
127        if (!$configuration and (!$configuration = cache_configuration_lire($plugin))) {
128                $configuration = cache_cache_configurer($plugin);
129        }
130
131        // Détermination du nom du cache en fonction du plugin appelant et du type
132        if ($fichier_cache = cache_nommer($plugin, $conteneur, $configuration)) {
133                // Lecture du fichier cache sécurisé ou pas suivant la configuration.
134                include_spip('inc/flock');
135                $lire = 'lire_fichier';
136                if ($configuration['securisation']) {
137                        $lire = 'lire_fichier_securise';
138                }
139                $contenu_cache = '';
140                $lecture_ok = $lire($fichier_cache, $contenu_cache);
141               
142                if ($lecture_ok) {
143                        if ($configuration['serialisation']) {
144                                $cache_lu = unserialize($contenu_cache);
145                        } else {
146                                $cache_lu = $contenu_cache;
147                        }
148                }
149        }
150
151        return $cache_lu;
152}
153
154
155/**
156 * Construit le chemin complet du fichier cache.
157 *
158 * @api
159 *
160 * @param string $plugin
161 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
162 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
163 * @param array  $conteneur
164 *        Tableau identifiant le cache pour lequel on veut construire le nom.
165 * @param array  $configuration
166 *        Configuration complète des caches du plugin utlisateur.
167 *
168 * @return string
169 */
170function cache_nommer($plugin, $conteneur, $configuration) {
171
172        // Initialisation du chemin complet du fichier cache
173        $fichier_cache = '';
174
175        // Détermination du répertoire final du fichier cache qui peut-être inclus dans un sous-dossier du dossier
176        // de base des caches du plugin.
177        $dir_cache = $configuration['dossier_base'];
178        if (!empty($conteneur['sous_dossier'])) {
179                // Si le conteneur nécessite un sous-dossier, appelé service dans l'identifiant du conteneur.
180                $dir_cache .= rtrim($conteneur['sous_dossier'], '/');
181        }
182
183        // Détermination du nom du cache sans extension.
184        // Celui-ci est construit à partir des éléments fournis sur le conteneur et de la configuration
185        // fournie par le plugin (liste ordonnée de composant).
186        $nom_cache = '';
187        foreach ($configuration['nom'] as $_composant) {
188                if (isset($conteneur[$_composant])) {
189                        $nom_cache .= ($nom_cache ? $configuration['separateur'] : '') . $conteneur[$_composant];
190                }
191        }
192
193        // Si le nom a pu être construit on finalise le chemin complet, sinon on renvoie une chaine vide.
194        if ($nom_cache) {
195                // L'extension par défaut est dans la configuration mais peut-être forcée pour un cache donné.
196                // Par contre, si le cache est sécurisé alors on ne tient pas compte du forçage éventuel car l'extension
197                // doit toujours être .php et celle-ci a été forcée lors de la configuration des caches du plugin.
198                $extension = (!empty($conteneur['extension']) and !$configuration['securisation'])
199                        ? $conteneur['extension']
200                        : $configuration['extension'];
201                // Le chemin complet
202                $fichier_cache = "${dir_cache}${nom_cache}${extension}";
203        }
204       
205        return $fichier_cache;
206}
207
208
209/**
210 * Renvoie le chemin complet du cache si celui-ci existe sinon renvoie une chaine vide.
211 *
212 * @api
213 *
214 * @param string $plugin
215 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
216 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
217 * @param array  $conteneur
218 *        Tableau identifiant le cache pour lequel on veut construire le nom.
219 * @param array  $configuration
220 *        Configuration complète des caches du plugin utlisateur.
221 *
222 * @return string
223 */
224function cache_existe($plugin, $conteneur) {
225
226        // Lecture de la configuration des caches du plugin.
227        // Si celle-ci n'existe pas encore elle est créée (cas d'un premier appel, peu probable pour cette fonction).
228        static $configuration = array();
229        if (!$configuration and (!$configuration = cache_configuration_lire($plugin))) {
230                $configuration = cache_cache_configurer($plugin);
231        }
232
233        // Détermination du nom du cache en fonction du plugin appelant et du type
234        if ($fichier_cache = cache_nommer($plugin, $conteneur, $configuration)) {
235                // Vérifier l'existence du fichier.
236                if (!file_exists($fichier_cache)) {
237                        $fichier_cache = '';
238                }
239        } else {
240                $fichier_cache = '';
241        }
242
243        return $fichier_cache;
244}
245
246
247/**
248 * Supprime le cache spécifié d'un plugin donné.
249 *
250 * @api
251 *
252 * @param string $plugin
253 *        Identifiant qui permet de distinguer le module appelant qui peut-être un plugin comme le noiZetier
254 *        ou un script. Pour un plugin, le plus pertinent est d'utiliser le préfixe.
255 * @param string $nom_cache
256 *        Nom et extension du fichier cache.
257 *
258 * @return void
259 */
260function cache_vider($plugin, $caches = array()) {
261
262        // Détermination du nom du cache en fonction du plugin appelant et du type
263        $fichier_cache = '';
264
265        // Suppression du fichier cache
266        include_spip('inc/flock');
267        supprimer_fichier($fichier_cache);
268}
Note: See TracBrowser for help on using the repository browser.