Changeset 82426 in spip-zone


Ignore:
Timestamp:
May 15, 2014, 7:51:41 PM (5 years ago)
Author:
marcimat@…
Message:

Réorganisation de l'indexation complète des documents, en permettant d'avoir plus de stats…

Location:
_plugins_/indexer/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/indexer/trunk/Sources/SpipSourcesIndexer.php

    r82421 r82426  
    1616    /** @var bool Tables de liens présentes (spip 3 ?) */
    1717    private $tables_liens = true;
     18
     19    /** @var string clé de config */
     20    private $meta_stats = 'indexer/indexing/stats';
    1821
    1922    /**
     
    6164
    6265
    63     public function loadIndexesInfos() {
     66    public function loadIndexesStats() {
    6467        include_spip('inc/config');
    65         $data = lire_config('indexer/indexing/last', []);
    66         if (!is_array($data)) {
    67             $data = [];
    68         }
    69         return $data + [
    70             'source' => 0,
    71             'start'  => 0,
    72             'timeout' => 0,
     68        $stats = lire_config($this->meta_stats, []);
     69        if (!is_array($stats)) {
     70            $stats = [];
     71        }
     72        return $stats + [
     73            'last' => [
     74                'sourceClass' => '',
     75                'source'      => 0,
     76                'part'        => 0,
     77                'documents'   => 0,
     78                'time' => [
     79                    'documents'   => 0,
     80                    'indexing'    => 0,
     81                ],
     82            ],
    7383            'sources' => [],
    7484        ];
    7585    }
    7686
    77     public function saveIndexesInfos($data) {
     87    public function loadIndexesStatsClean() {
     88        $stats = $this->loadIndexesStats();
     89        $stats['last']['documents'] = 0;
     90        $stats['last']['time'] = [
     91            'documents'   => 0,
     92            'indexing'    => 0,
     93        ];
     94        return $stats;
     95    }
     96
     97    public function saveIndexesStats($stats) {
    7898        include_spip('inc/config');
    79         ecrire_config('indexer/indexing/last', $data);
    80     }
    81 
    82     public function resetIndexesInfos() {
     99        ecrire_config($this->meta_stats, $stats);
     100    }
     101
     102    public function resetIndexesStats() {
    83103        include_spip('inc/config');
    84         effacer_config('indexer/indexing/last');
     104        effacer_config($this->meta_stats);
    85105    }
    86106
     
    93113        $this->initTimeout();
    94114
    95         $infos = $this->loadIndexesInfos();
    96         $this->resetIndexesInfos();
    97 
    98         echo "<h1>Indexer tous les contenus :</h1>\n";
    99         echo "\n<pre>"; print_r($infos); echo "</pre>\n";
     115        $stats = $this->loadIndexesStatsClean();
     116        $this->resetIndexesStats();
    100117
    101118        $sources = $this->sources->getIterator();
    102         if ($infos['sources']) {
    103             $sources->seek($infos['sources']);
     119        // se replacer à la dernière source renseignée (cas d'une indexation non terminée)
     120        if ($stats['last']['source']) {
     121            $sources->seek($infos['last']['source']);
    104122        }
    105123
    106124        while ($sources->valid()) {
    107             $key    = $sources->key();
    108             $source = $sources->current();
    109 
    110 
    111             $source->setTablesLiens($this->tables_liens); // pour SPIP 2.1
    112             echo "<h2>Analyse de $source :</h2>\n";
    113             spip_timer('source');
    114 
    115             $parts = new \ArrayIterator($source->getParts(1000));
    116             if ($infos['start']) {
    117                 $parts->seek($infos['start']);
    118             }
    119 
    120             while ($parts->valid()) {
    121                 $part = $parts->current();
    122 
    123                 $documents = $source->getDocuments($part['start'], $part['end']);
    124 
    125                 if (count($documents)) {
    126                     spip_timer('indexage');
    127                     $this->indexer->replaceDocuments($documents);
    128 
    129                     echo "<br /><strong>Temps pour indexer " . count($documents). "</strong>\n";
    130                     echo "<br /><i>ids entre $part[start] et $part[end] :</i><br />\n";
    131                     echo spip_timer('indexage');
    132                 }
    133 
    134                 if ($this->isTimeout()) {
    135                     $this->saveIndexesInfos([
    136                         'timeout' => true,
    137                         'source' => $key,
    138                         'sourceClass' => (string)$source,
    139                         'sourceTime'  => spip_timer('source'),
    140                         'start' => $parts->key(),
    141                     ]);
    142                     return false;
    143                 }
    144 
    145                 $parts->next();
    146             }
    147 
    148 
    149             echo "<hr /><strong>Temps pour $source :</strong><br />";
    150             echo $t = spip_timer('source');
    151 
     125            $skey    = $sources->key();
     126            $source  = $sources->current();
     127
     128            $stats['last']['source'] = $skey;
     129            $stats['last']['sourceClass'] = (string)$source;
     130
     131            if (!isset($stats['sources'][$skey])) {
     132                $stats['sources'][$skey] = [
     133                    'sourceClass' => (string)$source,
     134                    'documents' => 0,
     135                    'time' => [
     136                        'documents' => 0,
     137                        'indexing' => 0,
     138                        'total' => 0
     139                    ]
     140                ];
     141            }
     142
     143            $this->indexSource($source, $skey, $stats);
    152144
    153145            if ($this->isTimeout()) {
    154                 $this->saveIndexesInfos([
    155                     'timeout' => true,
    156                     'source' => $key,
    157                     'sourceClass' => (string)$source,
    158                     'sourceTime'  => $t,
    159                     'start' => 0,
    160                 ]);
     146                break;
     147            }
     148
     149            $sources->next();
     150        }
     151
     152        if ($this->isTimeout()) {
     153            $this->saveIndexesStats($stats);
     154            return false;
     155        }
     156
     157        $this->resetIndexesStats();
     158        return $stats;
     159    }
     160
     161
     162
     163    private function indexSource($source, $skey, &$stats) {
     164
     165        $source->setTablesLiens($this->tables_liens); // pour SPIP 2.1
     166
     167        echo "<h2>Analyse de $source :</h2>\n";
     168        spip_timer('source');
     169
     170        // on découpe les documents de cette sources en parts d'un certain nombre
     171        // afin d'éviter un timeout et une surcharge mémoire
     172        $parts = new \ArrayIterator($source->getParts(1000));
     173
     174        // on se replace à la dernière part renseignée (cas d'une indexation non terminée)
     175        if ($stats['last']['part']) {
     176            $parts->seek($stats['last']['part']);
     177        }
     178
     179        while ($parts->valid()) {
     180            $part = $parts->current();
     181            $stats['last']['part'] = $parts->key();
     182            $this->indexSourcePart($source, $skey, $part, $stats);
     183
     184            if ($this->isTimeout()) {
     185                $t = spip_timer('source', true);
     186                $stats['sources'][$skey]['time']['total'] += $t;
    161187                return false;
    162188            }
    163 
    164 
    165             $sources->next();
    166         }
    167 
    168 
    169 
    170         $this->resetIndexesInfos();
    171         return true;
     189            $parts->next();
     190        }
     191
     192        echo "<hr /><strong>Temps pour $source :</strong><br />";
     193        $t = spip_timer('source', true);
     194        $stats['sources'][$skey]['time']['total'] += $t;
     195        echo $this->getNiceTime( $stats['sources'][$skey]['time']['total'] );
     196    }
     197
     198
     199
     200    private function indexSourcePart($source, $skey, $part, &$stats) {
     201
     202        spip_timer('documents');
     203        $documents = $source->getDocuments($part['start'], $part['end']);
     204        $t = spip_timer('documents', true);
     205        $nb = count($documents);
     206
     207        $stats['last']['documents'] += $nb;
     208        $stats['last']['time']['documents'] += $t;
     209
     210        $stats['sources'][$skey]['documents'] += $nb;
     211        $stats['sources'][$skey]['time']['documents'] += $t;
     212
     213        if ($nb) {
     214            echo "<br /><strong>Temps pour indexer $nb documents (ids $part[start] à $part[end])</strong>\n";
     215            echo "<br />Documents: " . $this->getNiceTime($t) . "\n";
     216
     217            spip_timer('indexing');
     218            $this->indexer->replaceDocuments($documents);
     219            $t = spip_timer('indexing', true);
     220
     221            $stats['last']['time']['indexing'] += $t;
     222            $stats['sources'][$skey]['time']['indexing'] += $t;
     223            echo "<br />Indexage: " . $this->getNiceTime($t) . "\n";
     224        }
     225    }
     226
     227
     228
     229    /** Retourne un temps formaté pour une belle lecture */
     230    public function getNiceTime($p) {
     231        if ($p < 1000)
     232            $s = '';
     233        else {
     234            $s = sprintf("%d ", $x = floor($p/1000));
     235            $p -= ($x*1000);
     236        }
     237        return $s . sprintf($s?"%07.3f ms":"%.3f ms", $p);
    172238    }
    173239}
  • _plugins_/indexer/trunk/prive/squelettes/contenu/indexer.html

    r82420 r82426  
    2424    echo "\n<br/><a href='#SELF'>Recharger la page pour continuer l'indexation</a>";
    2525    echo "<script type='text/javascript'>window.location.reload();</script>";
     26} else {
     27    echo "\n<pre>"; print_r($res); echo "</pre>";
    2628}
    2729
Note: See TracChangeset for help on using the changeset viewer.