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()
Pingback: Bitacoras.com /