source: spip-zone/_plugins_/medias_nettoyage/trunk/medias_nettoyage_fonctions.php @ 82722

Last change on this file since 82722 was 82722, checked in by teddy.spip@…, 7 years ago

On reporte pour SPIP 2.1 les changements opérés depuis SPIP 3.0.
Etant donné qu'on n'utilise plus les onglets sur les pages, on peut se simplifier la tâche en allant chercher les pages de SPIP 3.
Un bug sur la recherche des tables principales en SPIP 2.1. On doit récupérer les clés de la globale et non le contenu des tableaux.
On incrémente z

  • Property svn:executable set to *
File size: 28.2 KB
Line 
1<?php
2/**
3 * Fonctions principales du plugin "Nettoyer la médiathèque"
4 *
5 * @plugin     Nettoyer la médiathèque
6 * @copyright  2014
7 * @author     Teddy Payet
8 * @licence    GNU/GPL
9 * @package    SPIP\Medias_nettoyage\Fonctions
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13    return;
14}
15include_spip('base/abstract_sql');
16include_spip('inc/documents');
17include_spip('inc/chercher_logo');
18
19/**
20 * Lister les extensions enregistrées dans la table spip_documents.
21 *
22 * @return array
23 *         Tableau des extensions uniques
24 */
25function medias_lister_extensions_documents ()
26{
27    $extensions = array();
28    $extensions_cibles = sql_allfetsel('DISTINCT extension', 'spip_documents');
29    foreach ($extensions_cibles as $extension) {
30        $extensions[] = $extension['extension'];
31    }
32    // On rajoute le répertoire "vignettes"
33    $extensions[] = 'vignettes';
34    return $extensions ;
35}
36
37/**
38 * Créer les répertoires des extensions des documents enregistrés en BDD.
39 *
40 * @uses medias_lister_extensions_documents()
41 * @uses _DIR_IMG
42 *
43 * @param  string $repertoire_img
44 *         Par défaut, on prend _DIR_IMG en référence.
45 *         On peut l'utiliser aussi pour le répertoire IMG/orphelins
46 * @return void
47 */
48function medias_creer_extensions_repertoires ($repertoire_img = _DIR_IMG)
49{
50    $extensions = medias_lister_extensions_documents();
51
52    foreach ($extensions as $extension) {
53        if (!is_dir($repertoire_img . $extension)) {
54            @mkdir($repertoire_img . $extension, _SPIP_CHMOD);
55        }
56    }
57    return;
58}
59
60/**
61 * Créer le répertoire "IMG/orphelins".
62 * Plus pratique d'avoir une fonction qu'on appellera en cas de besoin.
63 *
64 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
65 *
66 * @return void
67 */
68function medias_creer_repertoires_orphelins ()
69{
70    if (!is_dir(_MEDIAS_NETTOYAGE_REP_ORPHELINS)) {
71        @mkdir(_MEDIAS_NETTOYAGE_REP_ORPHELINS, _SPIP_CHMOD);
72    }
73    return;
74}
75
76/**
77 * Lister les répertoires présents dans IMG/ sans les sous-répertoires.
78 *
79 * @param  string $repertoire_img
80 *         Par défaut, on prend _DIR_IMG en référence.
81 *         On peut l'utiliser aussi pour le répertoire IMG/orphelins ou tout autre nom de répertoire.
82 * @return array
83 */
84function medias_lister_repertoires ($repertoire_img = _DIR_IMG)
85{
86    $repertoires = array();
87    // On vérifie que $repertoire_img passé en paramètre est bien un répertoire existant.
88    // cf. ../IMG/orphelins qui ne serait pas encore créé.
89    if (is_dir($repertoire_img)) {
90        $rep_img = array_diff(scandir($repertoire_img), array('..','.','.svn')); // On ne liste pas le répertoire .svn
91        foreach ($rep_img as $repertoire) {
92            if (is_dir($repertoire_img . $repertoire)) {
93                $repertoires[] = $repertoire_img . $repertoire;
94            }
95        }
96    }
97
98    return (array) $repertoires;
99}
100
101/**
102 * Lister tous les fichiers non distants enregistrés en BDD
103 *
104 * @uses get_spip_doc()
105 *
106 * @return array
107 *         Tableau contenant les urls des fichiers
108 */
109function medias_lister_documents_bdd ()
110{
111    $docs_fichiers = array();
112
113    $docs_bdd = sql_allfetsel('fichier', 'spip_documents', "distant='non' AND fichier!=''");
114    foreach ($docs_bdd as $doc) {
115        /**
116         * On formate par rapport au répertoire ../IMG/
117         * On évite les doubles // qu'il peut y avoir
118         */
119        $docs_fichiers[] = preg_replace("/\/\//", "/", get_spip_doc($doc['fichier']));
120    }
121    // on enlève les url vides issues de la base :
122    $docs_fichiers = array_filter($docs_fichiers);
123
124    // On trie dans l'ordre alphabétique :
125    sort($docs_fichiers);
126
127    return (array) $docs_fichiers;
128}
129
130/**
131 * Donner la taille en octets des documents non-distants enregistrés en BDD
132 *
133 * @return integer
134 */
135function medias_lister_documents_bdd_taille()
136{
137    $docs_bdd = sql_fetsel('SUM(taille) AS taille_totale', 'spip_documents', "distant='non' AND fichier!=''");
138    return $docs_bdd['taille_totale'];
139}
140
141/**
142 * Afficher le nombre de documents enregistrés en BDD
143 *
144 * @return integer|string
145 */
146function medias_lister_documents_bdd_complet_compteur ()
147{
148    return sql_countsel('spip_documents');
149}
150
151/**
152 * Donner la taille en octets de tous les documents enregistrés en BDD
153 *
154 * @return integer|string
155 */
156function medias_lister_documents_bdd_complet_taille()
157{
158    $docs_bdd = sql_fetsel('SUM(taille) AS taille_totale', 'spip_documents', "id_document > 0");
159    return $docs_bdd['taille_totale'];
160}
161
162/**
163 * Lister les documents enregistrés en BDD
164 * mais n'ayant plus de fichiers physiques dans IMG/
165 *
166 * @uses medias_lister_documents_bdd()
167 * @uses medias_lister_documents_repertoire()
168 *
169 * @return array
170 */
171function medias_lister_documents_bdd_orphelins()
172{
173    $docs_bdd = array_unique(array_diff(medias_lister_documents_bdd(), medias_lister_documents_repertoire()));
174    sort($docs_bdd);
175    return (array) $docs_bdd;
176}
177
178/**
179 * Donner la taille en octets des documents enregistrés en BDD
180 *
181 * @uses medias_lister_documents_bdd_orphelins()
182 * @uses _DIR_IMG
183 * @uses get_spip_doc()
184 *
185 * @return integer
186 */
187function medias_lister_documents_bdd_orphelins_taille()
188{
189    $documents_orphelins    = medias_lister_documents_bdd_orphelins();
190    $taille         = 0;
191    $pattern_img        = "/" . preg_replace("/\//", "\/", _DIR_IMG) . "/";
192
193    if (count($documents_orphelins) > 0) {
194        $documents_bdd = sql_allfetsel(
195            'fichier,taille',
196            'spip_documents',
197            "fichier IN ('"
198            . join("','", preg_replace($pattern_img, '', $documents_orphelins)) . "')"
199        );
200        foreach ($documents_bdd as $document_bdd) {
201            if (!file_exists(get_spip_doc($document_bdd['fichier']))) {
202                $taille = $taille + ($document_bdd['taille']/1000);
203                // On divise par 1000 pour éviter la limite de l'integer php.
204            }
205        }
206    }
207    return $taille * 1000;
208}
209
210/**
211 * Lister les documents présents dans le répertoire des extensions de IMG/
212 *
213 * @uses medias_lister_extensions_documents()
214 * @uses medias_lister_logos_fichiers()
215 *
216 * @param string $repertoire_img
217 *        On peut passer un nom de répertoire/chemin en paramètre.
218 *        Par défaut, on prend le répertoire IMG/
219 * @return array
220 */
221function medias_lister_documents_repertoire ($repertoire_img = _DIR_IMG)
222{
223    $docs_fichiers = array();
224
225    foreach (medias_lister_extensions_documents() as $extension) {
226        // On va chercher dans IMG/$extension/*.*
227        $fichiers = glob($repertoire_img . "$extension/*.*");
228        foreach ($fichiers as $fichier) {
229            $docs_fichiers[] = preg_replace("/\/\//", "/", $fichier);
230        }
231    }
232    // On va chercher dans IMG/*.*
233    $fichiers = glob($repertoire_img . "*.*");
234    foreach ($fichiers as $fichier) {
235        $docs_fichiers[] = $fichier;
236    }
237    $docs_fichiers = array_unique(
238        array_diff(
239            $docs_fichiers,
240            medias_lister_logos_fichiers()
241        )
242    );
243    sort($docs_fichiers);
244
245    return (array) $docs_fichiers;
246}
247
248/**
249 * Retourner la taille en octets des fichiers physiques présents
250 * dans les répertoires d'extensions de IMG
251 *
252 * @uses medias_lister_documents_repertoire()
253 * @uses medias_calculer_taille_fichiers()
254 *
255 * @return integer
256 */
257function medias_lister_documents_repertoire_taille ()
258{
259    return medias_calculer_taille_fichiers(medias_lister_documents_repertoire());
260}
261
262/**
263 * Lister les fichiers physiques présents dans IMG/ mais qui ne sont plus dans la BDD.
264 *
265 * @uses medias_lister_documents_repertoire()
266 * @uses medias_lister_documents_bdd()
267 *
268 * @return array
269 */
270function medias_lister_documents_repertoire_orphelins ()
271{
272    $docs_fichiers = array_unique(array_diff(medias_lister_documents_repertoire(), medias_lister_documents_bdd()));
273    sort($docs_fichiers);
274    return (array) $docs_fichiers;
275}
276
277/**
278 * Retourner la taille en octets des fichiers physiques orphelins
279 * présents dans les répertoires d'extensions de IMG
280 *
281 * @uses medias_lister_documents_repertoire_orphelins()
282 * @uses medias_calculer_taille_fichiers()
283 *
284 * @return integer
285 */
286function medias_lister_documents_repertoire_orphelins_taille ()
287{
288    return medias_calculer_taille_fichiers(medias_lister_documents_repertoire_orphelins());
289}
290
291/**
292 * Lister tous les fichiers contenus dans le répertoire IMG/
293 * y compris les logos.
294 *
295 * @param string $repertoire_img
296 *        On peut passer un nom de répertoire/chemin en paramètre.
297 *        Par défaut, on prend le répertoire IMG/
298 * @return array
299 */
300function medias_lister_documents_repertoire_complet ($repertoire_img = _DIR_IMG)
301{
302    $docs_fichiers = array();
303
304    // On va chercher dans IMG/distant/*/*.*
305        // Exemple : IMG/distant/jpg/nom_fichier.jpg
306    $fichiers = glob($repertoire_img . "*/*/*.*");
307    foreach ($fichiers as $fichier) {
308        $docs_fichiers[] = preg_replace("/\/\//", "/", $fichier);
309        // On évite les doubles slashs '//' qui pourrait arriver comme un cheveu sur la soupe.
310    }
311
312    // On va chercher dans IMG/*/*.*
313        // Exemple : IMG/pdf/nom_fichier.pdf
314    $fichiers = glob($repertoire_img . "*/*.*");
315    foreach ($fichiers as $fichier) {
316        $docs_fichiers[] = preg_replace("/\/\//", "/", $fichier);
317    }
318
319    // On va chercher dans IMG/*.*
320        // Exemple : IMG/arton4.png
321    $fichiers = glob($repertoire_img . "*.*");
322    foreach ($fichiers as $fichier) {
323        $docs_fichiers[] = preg_replace("/\/\//", "/", $fichier);
324    }
325
326    $docs_fichiers = array_unique($docs_fichiers);
327    sort($docs_fichiers);
328
329    return (array) $docs_fichiers;
330}
331
332/**
333 * Retourner la taille en octets des fichiers physiques présents
334 * dans IMG/
335 *
336 * @uses medias_lister_documents_repertoire_complet()
337 * @uses medias_calculer_taille_fichiers()
338 *
339 * @param string $repertoire_img
340 *        On peut passer un nom de répertoire/chemin en paramètre.
341 *        Par défaut, on prend le répertoire IMG/
342 * @return integer
343 */
344function medias_lister_documents_repertoire_complet_taille ($repertoire_img = _DIR_IMG)
345{
346    return medias_calculer_taille_fichiers(medias_lister_documents_repertoire_complet($repertoire_img));
347}
348
349/**
350 * Lister les logos des objets éditoriaux
351 * Prend en compte les cas particuliers suivants :
352 * - articles (art)
353 * - rubriques (rub)
354 * - brèves (breve)
355 * - sites syndiqués (site)
356 * - mot-clé (mot)
357 * - auteurs (aut)
358 *
359 * @todo étendre à d'autres objets éditoriaux.
360 *
361 * @param null|string $mode
362 *        + `null` : stockera dans le tableau tous les logos,
363 *        quelque soit le mode du logo
364 *        + `on` : stockera dans le tableau tous les logos du mode "on"
365 *        + `off` : stockera dans le tableau tous les logos du mode "off"
366 * @param string $repertoire_img
367 *        On peut passer un nom de répertoire/chemin en paramètre.
368 *        Par défaut, on prend le répertoire IMG/
369 * @return array
370 */
371function medias_lister_logos_fichiers ($mode = null, $repertoire_img = _DIR_IMG)
372{
373
374    if (intval(spip_version()) == 2) {
375        include_spip('base/connect_sql');
376        $tables_objets = (isset($GLOBALS['tables_principales']))
377        ? array_keys($GLOBALS['tables_principales'])
378        : array('spip_articles',
379            'spip_rubriques',
380            'spip_auteurs',
381            'spip_breves',
382            'spip_documents',
383            'spip_syndic',
384            'spip_mots',
385            'spip_forum',
386            'spip_groupes_mots');
387    } elseif (intval(spip_version()) == 3) {
388        include_spip('base/objets');
389        $tables_objets = array_keys(lister_tables_principales());
390    }
391
392    global $formats_logos;
393    $docs_fichiers_on   = array();
394    $docs_fichiers_off  = array();
395    $logos_objet        = array('art','rub','breve','site','mot','aut');
396    $fichiers           = array();
397
398    // On va chercher toutes les tables principales connues de SPIP
399    foreach ($tables_objets as $table) {
400        // On cherche son type d'objet et on l'ajoute aux logos
401        // Il y a aussi dans ces objets la référence à 'article',
402        // 'rubrique' et 'auteur'
403        // On peut les laisser, ça ne mange pas de pain de prendre
404        // en compte les "tordus" ;-)
405        $logos_objet[] = objet_type($table);
406    }
407    // On enlève les doublons
408    $logos_objet = array_unique($logos_objet);
409    sort($logos_objet);
410
411    // On va chercher le logo du site.
412    // On force la recherche sur cet élément même si la recherche "classique"
413    // devrait gérer cela initialement…
414    if ($logo_site = glob($repertoire_img . "site{on|off}0.*", GLOB_BRACE)
415        and count($logo_site) > 0) {
416        $fichiers = array_merge($fichiers, $logo_site);
417    }
418
419    // On va chercher dans IMG/*(on|off)*.*
420    // On fait un foreach pour ne pas avoir de
421    // "Pattern exceeds the maximum allowed length of 260 characters"
422    // sur glob()
423    foreach ($logos_objet as $logo_pattern) {
424        // la regex de GLOB_BRACE est très basique...
425        $liste = glob($repertoire_img . "{" . $logo_pattern ."}{on,off}*.*", GLOB_BRACE);
426        $fichiers = array_merge($fichiers, $liste);
427    }
428
429    foreach ($fichiers as $fichier) {
430        // ... Donc on fait une regex plus poussée avec un preg_match
431        if (preg_match("/(" . join("|", $logos_objet) .")on\d+.(" . join("|", $formats_logos) .")$/", $fichier)) {
432            $docs_fichiers_on[] = preg_replace("/\/\//", "/", $fichier);
433        }
434        if (preg_match("/(" . join("|", $logos_objet) .")off\d+.(" . join("|", $formats_logos) .")$/", $fichier)) {
435            $docs_fichiers_off[] = preg_replace("/\/\//", "/", $fichier);
436        }
437    }
438    if ($mode == 'on') {
439        $docs_fichiers_on = array_unique($docs_fichiers_on);
440        sort($docs_fichiers_on); // On trie dans l'ordre alphabétique
441        return $docs_fichiers_on;
442    } elseif ($mode == 'off') {
443        $docs_fichiers_off = array_unique($docs_fichiers_off);
444        sort($docs_fichiers_off); // On trie dans l'ordre alphabétique
445        return $docs_fichiers_off;
446    } else {
447        $docs_fichiers = array_unique(array_merge($docs_fichiers_on, $docs_fichiers_off));
448        sort($docs_fichiers); // On trie dans l'ordre alphabétique
449        return $docs_fichiers;
450    }
451
452}
453
454/**
455 * Retourner la taille en octets des logos présents
456 * dans IMG/
457 *
458 * @uses medias_lister_logos_fichiers()
459 * @uses medias_calculer_taille_fichiers()
460 *
461 * @param null|string $mode
462 *        + `null` : calculera le poids de tous les logos,
463 *        quelque soit le mode du logo
464 *        + `on` : calculera le poids de tous les logos du mode "on"
465 *        + `off` : calculera le poids de tous les logos du mode "off"
466 * @return integer|string
467 */
468function medias_lister_logos_fichiers_taille ($mode = null)
469{
470    return medias_calculer_taille_fichiers(medias_lister_logos_fichiers($mode));
471}
472
473/**
474 * Fonction générique pour calculer la taille des fichiers passés en paramètre
475 *
476 * @param  array  $fichiers
477 *         Tableau contenant l'url des fichiers physiques
478 * @return integer
479 *         On multiplie par 1000 la variable $taille pour avoir le chiffre réel
480 *         C'est un hack pour contourner la limite d'integer (4 bytes => 0xefffffff).
481 *         Au dessus de 4026531839, il passe à float négatif.
482 *         // a vérifier tout de même selon l'OS 32bit ou 64bit.
483 */
484function medias_calculer_taille_fichiers ($fichiers = array())
485{
486    $taille = 0;
487    if (count($fichiers) > 0) {
488        foreach ($fichiers as $fichier) {
489            if (file_exists($fichier)) {
490                $taille += filesize($fichier) /1000;
491            }
492        }
493        if (is_float($taille) or $taille > 0) {
494            return $taille *1000;
495        } else {
496            return $taille;
497        }
498    } else {
499        return $taille;
500    }
501}
502
503/**
504 * Lister les répertoires à la racine de IMG/orphelins.
505 * Cette fonction vérifie l'existence du répertoire IMG/orphelins
506 * avant de lister les répertoires.
507 *
508 * @uses medias_lister_repertoires()
509 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
510 *
511 * @return array
512 */
513function medias_lister_repertoires_orphelins ()
514{
515    if (is_dir(_MEDIAS_NETTOYAGE_REP_ORPHELINS)) {
516        return medias_lister_repertoires(_MEDIAS_NETTOYAGE_REP_ORPHELINS);
517    } else {
518        return array();
519    }
520}
521
522/**
523 * Lister le contenu du répertoire IMG/orphelins
524 *
525 * @uses medias_lister_documents_repertoire_complet()
526 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
527 *
528 * @return array
529 */
530function medias_lister_repertoires_orphelins_fichiers ()
531{
532    $repertoire_orphelins   = _MEDIAS_NETTOYAGE_REP_ORPHELINS;
533    $docs_fichiers      = array();
534
535    if (is_dir($repertoire_orphelins)) {
536        $docs_fichiers = medias_lister_documents_repertoire_complet($repertoire_orphelins);
537    }
538    return (array) $docs_fichiers;
539}
540
541/**
542 * Lister le contenu du répertoire IMG/orphelins
543 *
544 * @uses medias_calculer_taille_fichiers()
545 * @uses medias_lister_documents_repertoire_complet()
546 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
547 *
548 * @return integer
549 */
550function medias_lister_repertoires_orphelins_fichiers_taille ()
551{
552    $repertoire_orphelins   = _MEDIAS_NETTOYAGE_REP_ORPHELINS;
553    $taille         = 0;
554
555    if (is_dir($repertoire_orphelins)) {
556        return medias_calculer_taille_fichiers(medias_lister_documents_repertoire_complet($repertoire_orphelins));
557    } else {
558        return intval($taille);
559    }
560}
561
562/**
563 * Fonction 'bidon' pour tester une fonction rapidement sur la page ?exec=test_medias
564 *
565 * @return array
566 */
567function test_medias ()
568{
569    $test = array();
570    $test = @unserialize($GLOBALS['meta']['medias_nettoyage']);
571    return $test;
572}
573
574/**
575 * Déplacer tous les répertoires de types 'cache-*' et 'icones*'
576 * SPIP normalement, avec la page "réparer la base", devrait répérer ce type
577 * de dossier. Mais il peut arriver parfois qu'on récupère des sites qui
578 * pour X raisons n'ont pas été nettoyé de ces coquilles.
579 *
580 * @uses medias_creer_repertoires_orphelins()
581 * @uses _DIR_IMG
582 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
583 *
584 * @return void
585 */
586function medias_deplacer_rep_obsoletes ()
587{
588    spip_log(
589        date_format(date_create(), 'Y-m-d H:i:s')
590        . ' : Début de la procédure de déplacement des répertoires obsolètes.',
591        "medias_nettoyage"
592    );
593
594    $pattern_obsoletes  = array("cache-","icones");
595    $repertoire_img     = _DIR_IMG;
596    $repertoire_orphelins   = _MEDIAS_NETTOYAGE_REP_ORPHELINS;
597    $repertoires_obsoletes  = array();
598    $message_log        = array();
599    $pattern_img        = "/" . preg_replace("/\//", "\/", $repertoire_img) . "/";
600
601    // On crée le répertoire IMG/orphelins
602    medias_creer_repertoires_orphelins();
603
604    // on cherche les fichiers de type IMG/cache-20x20-blabla.ext
605    $fichiers_obsoletes = find_all_in_path('IMG/', '/cache-');
606
607    foreach ($pattern_obsoletes as $pattern) {
608        $repertoires = glob($repertoire_img . $pattern . "*");
609        $repertoires_obsoletes = array_merge($repertoires_obsoletes, $repertoires);
610    }
611    // on fusionne avec les fichiers obsolètes
612    $repertoires_obsoletes = array_merge($repertoires_obsoletes, $fichiers_obsoletes);
613
614    // on enlève les valeurs vides du tableau.
615    $repertoires_obsoletes = array_filter($repertoires_obsoletes);
616
617    if (count($repertoires_obsoletes) > 0) {
618        foreach ($repertoires_obsoletes as $repertoire_source) {
619            $repertoire_destination = preg_replace($pattern_img, $repertoire_orphelins, $repertoire_source);
620            @rename($repertoire_source, $repertoire_destination);
621            $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
622            . ' : Déplacement de '
623            . $repertoire_source
624            . ' vers '
625            . $repertoire_destination;
626        }
627    } else {
628        // S'il n'y a pas de dossiers obsolètes, on met un message histoire de ne pas rester dans le brouillard.
629        $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
630        . ' : Il n\'y a pas de dossiers ou de fichiers obsolètes';
631    }
632    spip_log(
633        "\n-------\n"
634        . join("\n", $message_log)
635        . "\n-------\n",
636        "medias_nettoyage"
637    );
638    spip_log(
639        date_format(date_create(), 'Y-m-d H:i:s')
640        . ' : Fin de la procédure de déplacement des répertoires obsolètes.',
641        "medias_nettoyage"
642    );
643    return;
644}
645
646/**
647 * On déplace tous les fichiers orphelins vers un répertoire orphelins dans IMG/
648 * On ne les supprime pas!
649 *
650 * @uses medias_creer_repertoires_orphelins()
651 * @uses medias_creer_extensions_repertoires()
652 * @uses medias_lister_documents_repertoire_orphelins()
653 * @uses _DIR_IMG
654 * @uses _MEDIAS_NETTOYAGE_REP_ORPHELINS
655 *
656 * @return array
657 */
658function medias_deplacer_documents_repertoire_orphelins ()
659{
660    /**
661     * On crée un log vraiment au début du script.
662     * Ainsi, on sait déjà en regardant les logs
663     * si le script est lancé ou pas.
664     */
665    spip_log(
666        date_format(date_create(), 'Y-m-d H:i:s')
667        . ' : Début de la procédure de déplacement.',
668        "medias_nettoyage"
669    );
670
671    $fichiers_orphelins     = medias_lister_documents_repertoire_orphelins();
672    $fichiers_deplaces  = array();
673    $message_log        = array();
674    $repertoire_orphelins   = _MEDIAS_NETTOYAGE_REP_ORPHELINS;
675    $pattern_img        = "/" . preg_replace("/\//", "\/", _DIR_IMG) . "/";
676
677    // On crée le répertoire IMG/orphelins s'il n'existe pas
678    medias_creer_repertoires_orphelins();
679    // On crée les répertoires d'extensions dans IMG/orphelins
680    medias_creer_extensions_repertoires($repertoire_orphelins);
681
682    // Si on n'a pas de fichiers orphelins, on ne lance pas la procédure.
683    if (count($fichiers_orphelins) > 0) {
684        foreach ($fichiers_orphelins as $fichier) {
685            $destination = preg_replace($pattern_img, $repertoire_orphelins, $fichier);
686            $chemin = explode('/', $destination);
687            $repertoires = '';
688            $profondeur = count($chemin) - 1;
689            $i = 0;
690            // On a déjà créé les répertoires d'extensions,
691            // mais on laisse cette sécu au cas où on a d'autres répertoires à créer.
692            while ($i < $profondeur) {
693                $repertoires = $repertoires . $chemin[$i] . '/';
694                $i++;
695            }
696            if (!is_dir($repertoires)) {
697                @mkdir($repertoires, _SPIP_CHMOD);
698                $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
699                . ' : le répertoire '
700                . $repertoires
701                . ' a été créé.';
702            }
703            // Hop, on déplace notre fichier vers IMG/orphelins
704            @rename($fichier, $destination);
705            $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
706            . ' : le fichier '
707            . $fichier
708            . ' a été déplacé vers '
709            . $destination
710            .'.';
711            // On construit un tableau dans le cas où qqn voudrait utiliser cette donnée.
712            // Pour le moment inutilisé.
713            $fichiers_deplaces[] = $destination;
714        }
715    } else {
716        $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
717        . ' : Il ne semble pas avoir de documents orphelins dans IMG/';
718    }
719
720    spip_log(
721        "\n-------\n"
722        . join("\n", $message_log)
723        . "\n-------\n",
724        "medias_nettoyage"
725    );
726    /**
727     * Et là, on marque bien la fin du script dans les logs.
728     */
729    spip_log(
730        date_format(date_create(), 'Y-m-d H:i:s')
731        . ' : Fin de la procédure de déplacement.',
732        "medias_nettoyage"
733    );
734
735    return true;
736}
737
738/**
739 * Réparer les documents.
740 * Il arrive parfois que suite à un problème de droits,
741 * les documents ne soient plus rangés correctement dans IMG/ext/fichier.ext
742 * mais dans un faux sous répertoire IMG/ext_fichier.ext
743 * Le présent script va recopier les fichiers mal placés,
744 * et changer leur référence dans la table spip_documents ;
745 * il donnera ensuite la liste des fichiers recopiés et
746 * des erreurs recontrées dans un fichier de log.
747 *
748 * Script repris de ce fichier :
749 * http://zone.spip.org/trac/spip-zone/browser/_outils_/repare_doc.html
750 *
751 * @uses medias_lister_logos_fichiers()
752 * @uses _DIR_IMG
753 *
754 * @return bool
755 */
756function medias_reparer_documents_fichiers ()
757{
758    /**
759     * On crée un log vraiment au début du script.
760     * Ainsi, on sait déjà en regardant les logs
761     * si le script est lancé ou pas.
762     */
763    spip_log(
764        date_format(date_create(), 'Y-m-d H:i:s')
765        . ' : Début de la procédure de réparation des documents.',
766        "medias_nettoyage"
767    );
768
769    $repertoire_img     = _DIR_IMG ;
770    $docs_fichiers      = array();
771    $pattern_img        = "/" . preg_replace("/\//", "\/", $repertoire_img) . "/";
772    $message_log        = array();
773
774    // On va chercher dans IMG/*.*
775    $fichiers = glob($repertoire_img . "*.*");
776    foreach ($fichiers as $fichier) {
777        $docs_fichiers[] = $fichier;
778    }
779    $docs_fichiers = array_filter(
780        array_diff(
781            $docs_fichiers,
782            medias_lister_logos_fichiers()
783        )
784    ); // a voir si on n'a pas de logos ce que ça donne comme ça…
785    $docs_fichiers = preg_replace($pattern_img, '', $docs_fichiers);
786
787    if (count($docs_fichiers) > 0) {
788        // On va échapper chaque valeur d'url de fichier car
789        // il peut arriver d'avoir des apostrophes dans le nom de fichier...
790        // #fail
791        foreach ($docs_fichiers as $url_fichier) {
792            $url_fichiers[] = sql_quote($url_fichier);
793        }
794        $docs_bdd = sql_allfetsel(
795            'id_document,fichier',
796            'spip_documents',
797            "fichier IN ("
798            . join(",", $url_fichiers)
799            . ")"
800        );
801        foreach ($docs_bdd as $document) {
802            $destination = preg_replace(',^([a-z0-3]+)_([^/]+\.(\1))$,i', '$1/$2', $document['fichier']);
803            // On va vérifier si on est bien sous la forme ../IMG/ext/nom_fichier.ext
804            // Sinon, on le construit manuellement.
805            // (ne pas oublier d'enlever '../IMG/' à notre variable de test
806            // car cette variable sera enresgitrée en BDD)
807            $destination_test = preg_replace($pattern_img, '', $destination);
808            if (count(explode("/", $destination_test)) == 1) {
809                $destination = $document['extension'] . '/' . $destination_test ;
810            }
811            if ($document['fichier'] != $destination
812                and rename($repertoire_img . $document['fichier'], $repertoire_img . $destination)) {
813                sql_updateq(
814                    'spip_documents',
815                    array('fichier' => $destination),
816                    'id_document=' . $document['id_document']
817                );
818                $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
819                . ' : le fichier '
820                . $repertoire_img
821                . $document['fichier']
822                . ' a été déplacé vers '
823                . $repertoire_img
824                . $destination
825                .'.';
826            } else {
827                $message_log[] = date_format(date_create(), 'Y-m-d H:i:s')
828                . ' : le fichier '
829                . $repertoire_img
830                . $document['fichier']
831                . ' n\'a pu être déplacé vers '
832                . $repertoire_img
833                . $destination
834                . '.';
835            }
836        }
837    } else {
838        $message_log[] = date_format(date_create(), 'Y-m-d H:i:s') . ' : Il n\'y a pas de documents à réparer.';
839    }
840
841    spip_log(
842        "\n-------\n"
843        . join("\n", $message_log)
844        . "\n-------\n",
845        "medias_nettoyage"
846    );
847    /**
848     * Et là, on marque bien la fin du script dans les logs.
849     */
850    spip_log(
851        date_format(date_create(), 'Y-m-d H:i:s')
852        . ' : Fin de la procédure de réparation des documents.',
853        "medias_nettoyage"
854    );
855
856    return true;
857}
858
859?>
Note: See TracBrowser for help on using the repository browser.