erreur thunmbail4
[aidenligne_francais_universite.git] / ecrire / base / optimiser.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13
14 if (!defined("_ECRIRE_INC_VERSION")) return;
15
16 // heure de reference pour le garbage collector = 24h auparavant
17 // http://doc.spip.org/@optimiser_base
18 function optimiser_base($attente = 86400) {
19 spip_log ("optimisation de la base");
20
21 # format = 20060610110141, si on veut forcer une optimisation tout de suite
22 $mydate = date("YmdHis", time() - $attente);
23
24
25 //
26 // MySQL
27 //
28 if ($GLOBALS['table_prefix']) $table_pref = $GLOBALS['table_prefix']."_";
29 else $table_pref = "";
30
31 $result = spip_query("SHOW TABLES LIKE '$table_pref%'");
32
33 // on ne va OPTIMIZE qu'une seule des tables a chaque fois,
34 // pour ne pas vautrer le systeme
35 // lire http://dev.mysql.com/doc/refman/5.0/fr/optimize-table.html
36 while ($row = spip_fetch_array($result,SPIP_NUM)) $tables[] = $row[0];
37
38 if ($tables) {
39 $table_op = intval($GLOBALS['meta']['optimiser_table']+1) % sizeof($tables);
40 ecrire_meta('optimiser_table', $table_op);
41 ecrire_metas();
42 $query = "OPTIMIZE TABLE ".$tables[$table_op];
43 spip_log($query);
44 spip_query($query);
45 spip_log("$query : ok");
46 }
47
48
49 // Les requetes DELETE multi table ne sont pas supportees par mysql<4.0
50 // et ont une syntaxe differente entre 4.0 et 4.1
51 // On passe donc par un SELECT puis DELETE unitaire dans une boucle while
52 // en pariant sur le fait que le nombre d'objets a supprimer est marginal
53
54 //
55 // Rubriques
56 //
57
58 # les articles qui sont dans une id_rubrique inexistante
59 $res = spip_query("SELECT articles.id_article
60 FROM spip_articles AS articles
61 LEFT JOIN spip_rubriques AS rubriques
62 ON articles.id_rubrique=rubriques.id_rubrique
63 WHERE rubriques.id_rubrique IS NULL
64 AND articles.maj < $mydate");
65
66 while ($row = spip_fetch_array($res,SPIP_ASSOC))
67 spip_query("DELETE FROM spip_articles
68 WHERE id_article=".$row['id_article']);
69
70 # les breves qui sont dans une id_rubrique inexistante
71 $res = spip_query("SELECT breves.id_breve
72 FROM spip_breves AS breves
73 LEFT JOIN spip_rubriques AS rubriques
74 ON breves.id_rubrique=rubriques.id_rubrique
75 WHERE rubriques.id_rubrique IS NULL
76 AND breves.maj < $mydate");
77
78 while ($row = spip_fetch_array($res,SPIP_ASSOC))
79 spip_query("DELETE FROM spip_breves
80 WHERE id_breve=".$row['id_breve']);
81
82 # les forums lies a une id_rubrique inexistante
83 $res = spip_query("SELECT forum.id_forum FROM spip_forum AS forum
84 LEFT JOIN spip_rubriques AS rubriques
85 ON forum.id_rubrique=rubriques.id_rubrique
86 WHERE rubriques.id_rubrique IS NULL
87 AND forum.id_rubrique>0");
88
89 while ($row = spip_fetch_array($res,SPIP_ASSOC))
90 spip_query("DELETE FROM spip_forum
91 WHERE id_forum=".$row['id_forum']);
92
93 # les droits d'auteurs sur une id_rubrique inexistante
94 $res = spip_query("SELECT auteurs_rubriques.id_rubrique,auteurs_rubriques.id_auteur
95 FROM spip_auteurs_rubriques AS auteurs_rubriques
96 LEFT JOIN spip_rubriques AS rubriques
97 ON auteurs_rubriques.id_rubrique=rubriques.id_rubrique
98 WHERE rubriques.id_rubrique IS NULL");
99
100 while ($row = spip_fetch_array($res,SPIP_ASSOC))
101 spip_query("DELETE FROM spip_auteurs_rubriques
102 WHERE id_auteur=".$row['id_auteur']
103 ." AND id_rubrique=".$row['id_rubrique']);
104
105
106 # les liens des documents qui sont dans une id_rubrique inexistante
107 $res = spip_query("SELECT documents_rubriques.id_document,documents_rubriques.id_rubrique
108 FROM spip_documents_rubriques AS documents_rubriques
109 LEFT JOIN spip_rubriques AS rubriques
110 ON documents_rubriques.id_rubrique=rubriques.id_rubrique
111 WHERE rubriques.id_rubrique IS NULL");
112
113 while ($row = spip_fetch_array($res,SPIP_ASSOC))
114 spip_query("DELETE FROM spip_documents_rubriques
115 WHERE id_document=".$row['id_document']
116 ." AND id_rubrique=".$row['id_rubrique']);
117
118 # les liens des mots affectes a une id_rubrique inexistante
119 $res = spip_query("SELECT mots_rubriques.id_mot,mots_rubriques.id_rubrique
120 FROM spip_mots_rubriques AS mots_rubriques
121 LEFT JOIN spip_rubriques AS rubriques
122 ON mots_rubriques.id_rubrique=rubriques.id_rubrique
123 WHERE rubriques.id_rubrique IS NULL");
124
125 while ($row = spip_fetch_array($res,SPIP_ASSOC))
126 spip_query("DELETE FROM spip_mots_rubriques
127 WHERE id_mot=".$row['id_mot']
128 ." AND id_rubrique=".$row['id_rubrique']);
129
130
131 //
132 // Articles
133 //
134
135 spip_query("DELETE FROM spip_articles
136 WHERE statut='poubelle' AND maj < $mydate");
137
138
139 # les liens d'auteurs d'articles effaces
140 $res = spip_query("SELECT auteurs_articles.id_auteur,auteurs_articles.id_article
141 FROM spip_auteurs_articles AS auteurs_articles
142 LEFT JOIN spip_articles AS articles
143 ON auteurs_articles.id_article=articles.id_article
144 WHERE articles.id_article IS NULL");
145
146 while ($row = spip_fetch_array($res,SPIP_ASSOC))
147 spip_query("DELETE FROM spip_auteurs_articles
148 WHERE id_auteur=".$row['id_auteur']
149 ." AND id_article=".$row['id_article']);
150
151 # les liens de documents d'articles effaces
152 $res = spip_query("SELECT documents_articles.id_document,documents_articles.id_article
153 FROM spip_documents_articles AS documents_articles
154 LEFT JOIN spip_articles AS articles
155 ON documents_articles.id_article=articles.id_article
156 WHERE articles.id_article IS NULL");
157
158 while ($row = spip_fetch_array($res,SPIP_ASSOC))
159 spip_query("DELETE FROM spip_documents_articles
160 WHERE id_document=".$row['id_document']
161 ." AND id_article=".$row['id_article']);
162
163 # les liens de mots affectes a des articles effaces
164 $res = spip_query("SELECT mots_articles.id_mot,mots_articles.id_article
165 FROM spip_mots_articles AS mots_articles
166 LEFT JOIN spip_articles AS articles
167 ON mots_articles.id_article=articles.id_article
168 WHERE articles.id_article IS NULL");
169
170 while ($row = spip_fetch_array($res,SPIP_ASSOC))
171 spip_query("DELETE FROM spip_mots_articles
172 WHERE id_mot=".$row['id_mot']
173 ." AND id_article=".$row['id_article']);
174
175 # les forums lies a des articles effaces
176 $res = spip_query("SELECT forum.id_forum
177 FROM spip_forum AS forum
178 LEFT JOIN spip_articles AS articles
179 ON forum.id_article=articles.id_article
180 WHERE articles.id_article IS NULL
181 AND forum.id_article>0");
182
183 while ($row = spip_fetch_array($res,SPIP_ASSOC))
184 spip_query("DELETE FROM spip_forum
185 WHERE id_forum=".$row['id_forum']);
186
187
188 //
189 // Breves
190 //
191
192 spip_query("DELETE FROM spip_breves
193 WHERE statut='refuse' AND maj < $mydate");
194
195
196 # les liens de documents sur des breves effacees
197 $res = spip_query("SELECT documents_breves.id_document,documents_breves.id_breve
198 FROM spip_documents_breves AS documents_breves
199 LEFT JOIN spip_breves AS breves
200 ON documents_breves.id_breve=breves.id_breve
201 WHERE breves.id_breve IS NULL");
202
203 while ($row = spip_fetch_array($res,SPIP_ASSOC))
204 spip_query("DELETE FROM spip_documents_breves
205 WHERE id_document=".$row['id_document']
206 ." AND id_breve=".$row['id_breve']);
207
208 # les liens de mots affectes a des breves effacees
209 $res = spip_query("SELECT mots_breves.id_mot,mots_breves.id_breve
210 FROM spip_mots_breves AS mots_breves
211 LEFT JOIN spip_breves AS breves
212 ON mots_breves.id_breve=breves.id_breve
213 WHERE breves.id_breve IS NULL");
214
215 while ($row = spip_fetch_array($res,SPIP_ASSOC))
216 spip_query("DELETE FROM spip_mots_breves
217 WHERE id_mot=".$row['id_mot']
218 ." AND id_breve=".$row['id_breve']);
219
220 # les forums lies a des breves effacees
221 $res = spip_query("SELECT forum.id_forum
222 FROM spip_forum AS forum
223 LEFT JOIN spip_breves AS breves
224 ON forum.id_breve=breves.id_breve
225 WHERE breves.id_breve IS NULL
226 AND forum.id_breve>0");
227
228 while ($row = spip_fetch_array($res,SPIP_ASSOC))
229 spip_query("DELETE FROM spip_forum
230 WHERE id_forum=".$row['id_forum']);
231
232
233 //
234 // Sites
235 //
236
237 spip_query("DELETE FROM spip_syndic
238 WHERE maj < $mydate AND statut = 'refuse'");
239
240
241 # les articles syndiques appartenant a des sites effaces
242 $res = spip_query("SELECT syndic_articles.id_syndic_article,syndic_articles.id_syndic
243 FROM spip_syndic_articles AS syndic_articles
244 LEFT JOIN spip_syndic AS syndic
245 ON syndic_articles.id_syndic=syndic.id_syndic
246 WHERE syndic.id_syndic IS NULL");
247
248 while ($row = spip_fetch_array($res,SPIP_ASSOC))
249 spip_query("DELETE FROM spip_syndic_articles
250 WHERE id_syndic_article=".$row['id_syndic_article']
251 ." AND id_syndic=".$row['id_syndic']);
252
253 # les liens de mots affectes a des sites effaces
254 $res = spip_query("SELECT mots_syndic.id_mot,mots_syndic.id_syndic
255 FROM spip_mots_syndic AS mots_syndic
256 LEFT JOIN spip_syndic AS syndic
257 ON mots_syndic.id_syndic=syndic.id_syndic
258 WHERE syndic.id_syndic IS NULL");
259
260 while ($row = spip_fetch_array($res,SPIP_ASSOC))
261 spip_query("DELETE FROM spip_mots_syndic
262 WHERE id_mot=".$row['id_mot']
263 ." AND id_syndic=".$row['id_syndic']);
264
265 # les forums lies a des sites effaces
266 $res = spip_query("SELECT forum.id_forum
267 FROM spip_forum AS forum
268 LEFT JOIN spip_syndic AS syndic
269 ON forum.id_syndic=syndic.id_syndic
270 WHERE syndic.id_syndic IS NULL
271 AND forum.id_syndic>0");
272
273 while ($row = spip_fetch_array($res,SPIP_ASSOC))
274 spip_query("DELETE FROM spip_forum
275 WHERE id_forum=".$row['id_forum']);
276
277
278 //
279 // Auteurs
280 //
281
282 # les liens d'articles sur des auteurs effaces
283 $res = spip_query("SELECT auteurs_articles.id_auteur,auteurs_articles.id_article
284 FROM spip_auteurs_articles AS auteurs_articles
285 LEFT JOIN spip_auteurs AS auteurs
286 ON auteurs_articles.id_auteur=auteurs.id_auteur
287 WHERE auteurs.id_auteur IS NULL");
288
289 while ($row = spip_fetch_array($res,SPIP_ASSOC))
290 spip_query("DELETE FROM spip_auteurs_articles
291 WHERE id_auteur=".$row['id_auteur']
292 ." AND id_article=".$row['id_article']);
293
294 # les liens de messages sur des auteurs effaces
295 $res = spip_query("SELECT auteurs_messages.id_auteur,auteurs_messages.id_message
296 FROM spip_auteurs_messages AS auteurs_messages
297 LEFT JOIN spip_auteurs AS auteurs
298 ON auteurs_messages.id_auteur=auteurs.id_auteur
299 WHERE auteurs.id_auteur IS NULL");
300
301 while ($row = spip_fetch_array($res,SPIP_ASSOC))
302 spip_query("DELETE FROM spip_auteurs_messages
303 WHERE id_auteur=".$row['id_auteur']
304 ." AND id_message=".$row['id_message']);
305
306 # les liens de rubriques sur des auteurs effaces
307 $res = spip_query("SELECT auteurs_rubriques.id_auteur,auteurs_rubriques.id_rubrique
308 FROM spip_auteurs_rubriques AS auteurs_rubriques
309 LEFT JOIN spip_rubriques AS rubriques
310 ON auteurs_rubriques.id_rubrique=rubriques.id_rubrique
311 WHERE rubriques.id_rubrique IS NULL");
312
313 while ($row = spip_fetch_array($res,SPIP_ASSOC))
314 spip_query("DELETE FROM spip_auteurs_rubriques
315 WHERE id_auteur=".$row['id_auteur']
316 ." AND id_rubrique=".$row['id_rubrique']);
317
318 # effacer les auteurs poubelle qui ne sont lies a aucun article
319 $res = spip_query("SELECT auteurs.id_auteur
320 FROM spip_auteurs AS auteurs
321 LEFT JOIN spip_auteurs_articles AS auteurs_articles
322 ON auteurs_articles.id_auteur=auteurs.id_auteur
323 WHERE auteurs_articles.id_auteur IS NULL
324 AND auteurs.statut='5poubelle' AND auteurs.maj < $mydate");
325
326 while ($row = spip_fetch_array($res,SPIP_ASSOC))
327 spip_query("DELETE FROM spip_auteurs
328 WHERE id_auteur=".$row['id_auteur']);
329
330 # supprimer les auteurs 'nouveau' qui n'ont jamais donne suite
331 # au mail de confirmation (45 jours pour repondre, ca devrait suffire)
332 spip_query("DELETE FROM spip_auteurs WHERE statut='nouveau' AND maj < ". _q(date('Y-m-d', time()-45*24*3600)));exit;
333
334
335 //
336 // Messages prives
337 //
338
339 # supprimer les messages lies a un auteur disparu
340 $res = spip_query("SELECT messages.id_message
341 FROM spip_messages AS messages
342 LEFT JOIN spip_auteurs AS auteurs
343 ON auteurs.id_auteur=messages.id_auteur
344 WHERE auteurs.id_auteur IS NULL");
345
346 while ($row = spip_fetch_array($res,SPIP_ASSOC))
347 spip_query("DELETE FROM spip_messages
348 WHERE id_message=".$row['id_message']);
349
350
351 //
352 // Mots-cles
353 //
354
355 $result = spip_query("DELETE FROM spip_mots
356 WHERE titre='' AND maj < $mydate");
357
358
359 # les liens mots-articles sur des mots effaces
360 $res = spip_query("SELECT mots_articles.id_mot,mots_articles.id_article
361 FROM spip_mots_articles AS mots_articles
362 LEFT JOIN spip_mots AS mots
363 ON mots_articles.id_mot=mots.id_mot
364 WHERE mots.id_mot IS NULL");
365
366 while ($row = spip_fetch_array($res,SPIP_ASSOC))
367 spip_query("DELETE FROM spip_mots_articles
368 WHERE id_mot=".$row['id_mot']
369 ." AND id_article=".$row['id_article']);
370
371 # les liens mots-breves sur des mots effaces
372 $res = spip_query("SELECT mots_breves.id_mot,mots_breves.id_breve
373 FROM spip_mots_breves AS mots_breves
374 LEFT JOIN spip_mots AS mots
375 ON mots_breves.id_mot=mots.id_mot
376 WHERE mots.id_mot IS NULL");
377
378 while ($row = spip_fetch_array($res,SPIP_ASSOC))
379 spip_query("DELETE FROM spip_mots_breves
380 WHERE id_mot=".$row['id_mot']
381 ." AND id_breve=".$row['id_breve']);
382
383 # les liens mots-forum sur des mots effaces
384 $res = spip_query("SELECT mots_forum.id_mot,mots_forum.id_forum
385 FROM spip_mots_forum AS mots_forum
386 LEFT JOIN spip_mots AS mots
387 ON mots_forum.id_mot=mots.id_mot
388 WHERE mots.id_mot IS NULL");
389
390 while ($row = spip_fetch_array($res,SPIP_ASSOC))
391 spip_query("DELETE FROM spip_mots_forum
392 WHERE id_mot=".$row['id_mot']
393 ." AND id_forum=".$row['id_forum']);
394
395 # les liens mots-rubriques sur des mots effaces
396 $res = spip_query("SELECT mots_rubriques.id_mot,mots_rubriques.id_rubrique
397 FROM spip_mots_rubriques AS mots_rubriques
398 LEFT JOIN spip_mots AS mots
399 ON mots_rubriques.id_mot=mots.id_mot
400 WHERE mots.id_mot IS NULL");
401
402 while ($row = spip_fetch_array($res,SPIP_ASSOC))
403 spip_query("DELETE FROM spip_mots_rubriques
404 WHERE id_mot=".$row['id_mot']
405 ." AND id_rubrique=".$row['id_rubrique']);
406
407 # les liens mots-syndic sur des mots effaces
408 $res = spip_query("SELECT mots_syndic.id_mot,mots_syndic.id_syndic
409 FROM spip_mots_syndic AS mots_syndic
410 LEFT JOIN spip_mots AS mots
411 ON mots_syndic.id_mot=mots.id_mot
412 WHERE mots.id_mot IS NULL");
413
414 while ($row = spip_fetch_array($res,SPIP_ASSOC))
415 spip_query("DELETE FROM spip_mots_syndic
416 WHERE id_mot=".$row['id_mot']
417 ." AND id_syndic=".$row['id_syndic']);
418
419
420 //
421 // Forums
422 //
423
424 spip_query("DELETE FROM spip_forum
425 WHERE statut='redac' AND maj < $mydate");
426
427
428 # les liens mots-forum sur des forums effaces
429 $res = spip_query("SELECT mots_forum.id_mot,mots_forum.id_forum
430 FROM spip_mots_forum AS mots_forum
431 LEFT JOIN spip_forum AS forum
432 ON mots_forum.id_forum=forum.id_forum
433 WHERE forum.id_forum IS NULL");
434
435 while ($row = spip_fetch_array($res,SPIP_ASSOC))
436 spip_query("DELETE FROM spip_mots_forum
437 WHERE id_mot=".$row['id_mot']
438 ." AND id_forum=".$row['id_forum']);
439
440 //
441 // Indexation
442 //
443
444 // les objets inutiles
445 include_spip('inc/indexation');
446 $liste_tables = liste_index_tables();
447 foreach ($liste_tables as $id_table => $table_objet) {
448 $col_id = primary_index_table($table_objet);
449 $critere = critere_optimisation($table_objet);
450 if (strlen($critere)>0)
451 $critere = "AND $critere";
452
453 spip_query("UPDATE $table_objet SET idx=''
454 WHERE idx<>'non' $critere");
455
456 $suppr = '';
457 $s = spip_query("SELECT $col_id FROM $table_objet
458 WHERE idx='' $critere");
459 while ($t = spip_fetch_array($s,SPIP_NUM))
460 $suppr .= ','.$t[0];
461 $s = spip_query("SELECT $col_id FROM $table_objet
462 WHERE idx='non'");
463 while ($t = spip_fetch_array($s,SPIP_NUM))
464 $suppr .= ','.$t[0];
465 if ($suppr)
466 spip_query("DELETE FROM spip_index
467 WHERE id_objet IN (0$suppr) AND id_table=$id_table");
468 }
469
470 spip_log("optimisation terminee");
471 }
472
473 ?>