source: spip-zone/_plugins_/mutualisation/inc/dirsize.php @ 48944

Last change on this file since 48944 was 48944, checked in by yffic@…, 10 years ago

Ajout des colonnes dans la page exec=mutualisation permettant de visualiser la taille des répertoires local, IMG et tmp/cache. Les calculs de sont lancés qu'après appui sur un bouton car ils sont assez long à effectuer. Ces calculs sont lancés en ajax, si le résultat en cours d'élaboration dépasse 500Mo (sans doute à régler à l'usage), la phase ajax est relancée pour chacun des sous répertoires (Ceci doit permettre d'éviter d'atteindre le max_execution_time de php).

Voilà, c'est à tester et si ça pose des problèmes que je n'ai pas vus, je dé-commite.

File size: 2.4 KB
Line 
1<?php
2// Ce programme appelé en ajax renvoie une chaine de la forme XXX##erreur
3//                      où XXX vaut -1 si erreur, -2 si taille max atteinte et sinon la taille du répertoire en Mo
4//                      où erreur explicite le type d'arreur
5// Param dir : répertoire à explorer
6//       taille_max : taille max au delà de laquelle la recherche s'arrête et renvoie -2
7
8$retour = dirsize($_GET['dir'],$_GET['taille_max']) ;
9if ( is_numeric($retour) )
10        echo round($retour/1024/1024,2);
11else
12        echo $retour ;
13
14
15/**
16 * Calculate the size of a directory by iterating its contents
17 *
18 * @author      Aidan Lister <aidan@php.net>, modifié par Yffic pour SPIP
19 * @version     1.2.0
20 * @link        http://aidanlister.com/2004/04/calculating-a-directories-size-in-php/
21 * @param       string   $directory    Path to directory
22 *              integer  $taille_max   Taille_max d'exploration
23 */
24function dirsize($path,$taille_max=0)
25{
26    // Init
27    $size = 0;
28 
29    // Trailing slash
30    if (substr($path, -1, 1) !== DIRECTORY_SEPARATOR) {
31        $path .= DIRECTORY_SEPARATOR;
32    }
33 
34    // Sanity check
35    if (is_file($path)) {
36        return filesize($path);
37    } elseif (!is_dir($path)) {
38        return ("-1##".$path);
39    }
40    // Iterate queue
41    $queue = array($path);
42    for ($i = 0, $j = count($queue); $i < $j; ++$i)
43    {
44        // Open directory
45        $parent = $i;
46        if (is_dir($queue[$i]) && $dir = @dir($queue[$i])) {
47            $subdirs = array();
48            while (false !== ($entry = $dir->read())) {
49                // Skip pointers
50                if ($entry == '.' || $entry == '..') {
51                    continue;
52                }
53 
54                // Get list of directories or filesizes
55                $path = $queue[$i] . $entry;
56                if (is_dir($path)) {
57                    $path .= DIRECTORY_SEPARATOR;
58                    $subdirs[] = $path;
59                } elseif (is_file($path)) {
60                    $size += filesize($path);
61                }
62                                         if($taille_max>0 && $size>$taille_max*1024*1024) return ("-2##".$queue[$i]) ;
63            }
64 
65            // Add subdirectories to start of queue
66            unset($queue[0]);
67            $queue = array_merge($subdirs, $queue);
68 
69            // Recalculate stack size
70            $i = -1;
71            $j = count($queue);
72 
73            // Clean up
74            $dir->close();
75            unset($dir);
76        }
77    }
78 
79    return $size;
80}
81
82?>
Note: See TracBrowser for help on using the repository browser.