Stavo facendo un paio di benchmark riguardo il calcolo delle dimensioni delle directory.
Al momento ho sperimentato due metodi.
Primo metodo: Ricorsione "semplice":
Codice PHP:
function DirSize_normal($dir) {
$dir=realpath($dir);
@$dh = opendir($dir);
$size = 0;
while ($file = @readdir($dh))
{
$path = $dir."/".$file;
if ( !in_array($file, ['.', '..'], true) && !is_link($path) )
{
if (is_dir($path) && is_readable($path))
$size += DirSize_normal($path); // recursive in sub-folders
elseif (is_file($path))
$size += filesize($path); // add file
}
}
@closedir($dh);
return $size;
}
Secondo metodo: RecursiveDirectoryIterator:
Codice PHP:
class ReadableFilter extends RecursiveFilterIterator {
public function accept(){
if ( $this->current()->isDir() && $this->current()->isReadable() )
return true;
else
if ( $this->current()->isFile() ) return true;
}
}
function DirSize_iterator($dir){
$tot_bytes = 0;
$dir = realpath($dir);
$objects = new RecursiveIteratorIterator(new ReadableFilter(new RecursiveDirectoryIterator($dir)));
foreach($objects as $name => $object){
if( in_array($name, ['.', '..'], true) || is_link($name))
continue;
if (is_file($name)) $tot_bytes+=filesize($name);
}
return $tot_bytes;
}
Nei miei test sembra che il PRIMO metodo (DirSize_normal) sia un po' più veloce..
Volevo sapere cosa ne pensate.. avete altre idee di implementazione?
Spero sia un argomento utile e interessante