[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/base/ -> optimiser.php (source)

   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  ?>


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics