Publi

Estadísticas de directorios en PHP

A veces, tenemos la necesidad de generar una estadística básica de algún subdirectorio de nuestras aplicaciones. Por ejemplo, para ver cuánto tenemos ocupado en caché, y ver si ésta se está regenerando bien (es sólo un ejemplo), puede que tengamos un directorio donde alojemos los archivos que suben nuestros usuarios y queramos ver si crece o no en el tiempo.

Este par de funciones pueden resultar útiles. Aún se pueden optimizar un poco, pero la idea aquí está. Es un conteo recursivo de los archivos de nuestros directorios en PHP, que es capaz de calcular:

  • ¿Cuántos archivos hay en total?
  • ¿Cuántos subdirectorios
  • El archivo más nuevo
  • El archivo más viejo
  • El subdirectorio con más archivos
  • El subdirectorio con menos archivos

y que podemos extender con algún que otro criterio que se nos ocurra.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
  /**
   ******************************************************************
   * @brief Fusiona estadísticas de directorios (ver getFolderStats())
   *
   * @param $s1     Es la colección de estadísticas 1 (la salida irá aquí)
   * @param $s2     Es la colección de estadísticas 2
   *
   * @return $s1    Revisada
   *
   ******************************************************************/

function mergeFolderStats(&$s1, $s2)
{
  $s1['size']      +=$s2['size'];     // Los tamaños totales los sumamos
  $s1['files']     +=$s2['files'];    // Los números de archivo también se suman
  $s1['subfolders']+=$s2['subfolders']; // Los números de directorios también se suman

  if ($s2['maxFilesFolder'])
    {
      if ((!$s1['maxFilesFolder']) || ($s2['maxFilesFolder'][1]>$s1['maxFilesFolder'][1]))
    $s1['maxFilesFolder']=$s2['maxFilesFolder'];
    }

  if ($s2['minFilesFolder'])
    {
      if ((!$s1['minFilesFolder']) || ($s2['minFilesFolder'][1]<$s1['minFilesFolder'][1]) )
    $s1['minFilesFolder']=$s2['minFilesFolder'];
    }

  if ($s2['newestFile'])
    {
      if ((!$s1['newestFile']) || ($s2['newestFile'][1]>$s1['newestFile'][1]))
    $s1['newestFile']=$s2['newestFile'];
    }

  if ($s2['oldestFile'])
    {
      if ((!$s1['oldestFile']) || ($s2['oldestFile'][1]<$s1['oldestFile'][1]))
    $s1['oldestFile']=$s2['oldestFile'];
    }

  return $s1;
}

/**
 ******************************************************************
 * @brief Obtiene estadísticas sobre un directorio
 *
 * @param $folder    Directorio a consultar
 *
 * @return Array con estadísticas: array('size'           => X,
 *                                       'files'          => X,
 *                                       'subfolders'     => X,
 *                                       'maxFilesFolder' => array (X, num, size), // Carpeta con más archivos y número de archivos y tamaño
 *                                       'minFilesFolder' => array (X, num, size), // Carpeta con menos archivos y número de archivos y tamaño
 *                                       'oldestFile'     => array (name, date),   // Archivo más viejo y fecha
 *                                       'newestFile'   => array (name, date),   // Archivo más nuevo y fecha
 *                                       )
 *
 ******************************************************************/

function getFolderStats($folder)
{
  $res=array('size'           => 0,
         'files'          => 0,
         'subfolders'     => 0,
         'oldestFile'     => false,
         'newestFile'   => false,
         'maxFilesFolder' => false,
         'minFilesFolder' => false,
         );
// Pone una barra al final
  if ($folder[strlen($folder)-1]!='/')
    $folder.='/';

  $d = dir($folder);
  $files=0;
  $size=0;
  while ($file=$d->read())
    {
      if ( ($file!='.') && ($file!='..') )
    {
      if (is_dir($folder.$file))
        {
          $tmp = getFolderStats($folder.$file);
          mergeFolderStats($res, $tmp);
          $res['subfolders']++;
        }
      else
        {
          $files++;
          $size+=filesize($folder.$file);
          $filemtime=filemtime($folder.$file);
          $oldest=(isset($res['oldestFile'][1]))?$res['oldestFile'][1]:0;
          $newest=(isset($res['newestFile'][1]))?$res['newestFile'][1]:0;

          if ( (!$res['oldestFile']) || ($filemtime<$oldest) )
        $res['oldestFile']= array($folder.$file, $filemtime);
          if ( (!$res['newestFile']) || ($filemtime>$newest) )
        {
          $res['newestFile']= array($folder.$file, $filemtime);
        }
        }
    }
    }

  $res['files']+=$files;
  $res['size']+=$size;
  if ( (!$res['maxFilesFolder']) || ($files>$res['maxFilesFolder'][1] ) )
    $res['maxFilesFolder']=array($folder, $files, $size);

  if ( (!$res['minFilesFolder']) || ($files<$res['minFilesFolder'][1] ) )
    $res['minFilesFolder']=array($folder, $files, $size);

  return $res;
}

print_r(getFolderStats('.'))
?>

Directamente podemos analizar el array que devuelve la función getFolderStats()

También podría interesarte....

There are 2 comments left Ir a comentario

  1. Pingback: Bitacoras.com /

  2. 3 Body Problem Jess Hong Coat /
    Usando Google Chrome Google Chrome 122.0.0.0 en Windows Windows NT

    You have a good point here! I totally agree with what you have said!! Thanks for sharing your views…hope more people will read this article!!!

Leave a Reply