Changeset 110767 in spip-zone for _plugins_/extraire_documents


Ignore:
Timestamp:
Jun 20, 2018, 10:20:17 AM (2 years ago)
Author:
cedric@…
Message:

Plus de verification de la taille de memoire dans la fonction generique, c'est a chaque parseur de gerer ca, cf r110766.
+ gestion d'un cache eventuel du contenu extrait via contenu et contenu_filehash qui peuvent etre fournis en entree dans document si connus (a charge pour l'appelant de stocker ces donnees fournies en sortie de l'extracteur)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/extraire_documents/trunk/inc/extraire_document.php

    r110759 r110767  
    99 *
    1010 *
    11  * @param $document le document à trairer avec au moins un id et un fichier
    12  * @return Sdata un tableau de donnée, si non traité alors false
     11 * @param array $document le document à trairer avec au moins un id et un fichier
     12 * @return array Sdata un tableau de donnée, si non traité alors false
    1313 */
    1414function inc_extraire_document_dist($document = array()) {
     
    5454        }
    5555
    56         if (!$fichier) {
     56        if (!$fichier or !file_exists($fichier)) {
    5757                return false;
    5858        }
     
    7474        finfo_close($finfo);
    7575
    76         //Ne pas traiter si la mémoire est insuffisante
    77         //On doit avoir au moins 3 fois la taille du fichier de disponible avant traitement (choix empirique)
    78         //http://stackoverflow.com/questions/10208698/checking-memory-limit-in-php
    79         $memory_used = memory_get_usage();
    80         $memory_limit = ini_get('memory_limit');
    81         // S'il n'y a PAS de limite de mémoire on en invente une super large
    82         if ($memory_limit == -1) {
    83                 $memory_limit = '512M';
    84         }
    85         $file_size = filesize($fichier);
    86         if (preg_match('/^(\d+)(.)$/', $memory_limit, $matches)) {
    87                 if ($matches[2] == 'M') {
    88                         $memory_limit = (int)$matches[1] * 1024 * 1024; // nnnM -> nnn MB
    89                 }
    90                 else if ($matches[2] == 'K') {
    91                         $memory_limit = (int)$matches[1] * 1024; // nnnK -> nnn KB
     76
     77        // On cherche le contenu
     78        $infos = array(
     79                'mime-type' => $mime,
     80                'contenu' => false,
     81        );
     82
     83        // si on a deja un contenu connu (extraction stockee en base par l'appelant)
     84        // l'utiliser en fallback
     85        if (isset($document['contenu']) and $document['contenu']) {
     86                $infos['contenu'] = $document['contenu'];
     87                if (isset($document['contenu_filehash']) and $document['contenu_filehash']) {
     88                        $infos['contenu_filehash'] = $document['contenu_filehash'];
    9289                }
    9390        }
    94         $memory_available = $memory_limit - $memory_used - 3 * $file_size;
    9591
    96         if ($memory_available < 0) {
    97                 return false;
    98         }
    99        
     92
    10093        // On cherche le bon extracteur de jus de fichier
    10194        // le test n'est fait qu'une seule fois par type MIME, on garde le résultat en mémoire
     
    140133                }
    141134        }
    142        
    143         // On cherche le contenu
    144         $infos = array(
    145                 'mime-type' => $mime,
    146                 'contenu' => false,
    147         );
    148        
    149         if (
    150                 $fonction_extraire
    151                 and $extraction = $fonction_extraire($fichier, $infos)
    152                 and is_array($extraction)
    153         ) {
    154                 $infos = array_merge($infos, $extraction);
     135
     136        if ($fonction_extraire) {
     137                $contenu_filehash = substr(md5(basename($fichier) . ':' . filemtime($fichier) . ':' . filesize($fichier) . ':' . $fonction_extraire),0,8);
     138                // si pas de contenu connu, ou si le hash du fichier a change (ou l'extracteur) ou var_mode
     139                // on rejoue le parsing
     140                if (!isset($document['contenu'])
     141                  or !isset($document['contenu_filehash'])
     142                  or $document['contenu_filehash'] !== $contenu_filehash
     143                  or _VAR_MODE) {
     144                        if (
     145                                $fonction_extraire
     146                                and $extraction = $fonction_extraire($fichier, $infos)
     147                                and is_array($extraction)
     148                        ) {
     149                                $infos = array_merge($infos, $extraction);
     150                                $infos['contenu_filehash'] = $contenu_filehash;
     151                        }
     152                }
    155153        }
    156        
     154
    157155        return $infos;
    158156}
Note: See TracChangeset for help on using the changeset viewer.