[ Index ] |
|
Code source de SPIP 1.9.2c |
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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Wed Nov 21 10:20:27 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |