Obtenez les tailles de répertoire sur un hôte distant avec un script PHP
Question
Je recherche quelque chose qui me montrera de manière récursive la taille de chaque dossier de mon dossier principal.
C'est un LAMPE serveur avec un CGI-Bin donc la plupart des scripts PHP devraient fonctionner ou tout ce qui fonctionnera dans le CGI-Bin.
Ma société d'hébergement ne me fournit pas d'interface permettant de voir quels dossiers consomment le plus d'espace.Je ne connais rien sur Internet et j'ai fait quelques recherches mais je n'ai trouvé aucun résultat.
Quelque chose implémentant des graphiques (DG/ImageMagick) serait préférable mais pas obligatoire.
Mon hôte ne prend en charge que Perl dans le CGI-BIN.
La solution
Bizarre, je suis tombé sur Google avec de nombreux résultats pertinents et celui-ci est probablement le plus complet.
La fonction « getDirectorySize » ignorer les coupures de lien vers fichiers/répertoire.La fonction « sizeFormat » suffixe la taille avec octets, Ko, Mo ou Go en conséquence.
Code
function getDirectorySize($path)
{
$totalsize = 0;
$totalcount = 0;
$dircount = 0;
if ($handle = opendir ($path))
{
while (false !== ($file = readdir($handle)))
{
$nextpath = $path . '/' . $file;
if ($file != '.' && $file != '..' && !is_link ($nextpath))
{
if (is_dir ($nextpath))
{
$dircount++;
$result = getDirectorySize($nextpath);
$totalsize += $result['size'];
$totalcount += $result['count'];
$dircount += $result['dircount'];
}
elseif (is_file ($nextpath))
{
$totalsize += filesize ($nextpath);
$totalcount++;
}
}
}
}
closedir ($handle);
$total['size'] = $totalsize;
$total['count'] = $totalcount;
$total['dircount'] = $dircount;
return $total;
}
function sizeFormat($size)
{
if($size<1024)
{
return $size." bytes";
}
else if($size<(1024*1024))
{
$size=round($size/1024,1);
return $size." KB";
}
else if($size<(1024*1024*1024))
{
$size=round($size/(1024*1024),1);
return $size." MB";
}
else
{
$size=round($size/(1024*1024*1024),1);
return $size." GB";
}
}
Usage
$path="/httpd/html/pradeep/";
$ar=getDirectorySize($path);
echo "<h4>Details for the path : $path</h4>";
echo "Total size : ".sizeFormat($ar['size'])."<br>";
echo "No. of files : ".$ar['count']."<br>";
echo "No. of directories : ".$ar['dircount']."<br>";
Sortir
Details for the path : /httpd/html/pradeep/
Total size : 2.9 MB
No. of files : 196
No. of directories : 20
Autres conseils
Si vous avez accès au shell, vous pouvez exécuter la commande
$ du -h
ou peut-être utilisez-le, si PHP est configuré pour autoriser l'exécution :
<?php $d = escapeshellcmd(dirname(__FILE__)); echo nl2br(`du -h $d`) ?>
nombre_fichiers_et_size.php
<?php
if (isset($_POST["nivel"])) {
$mostrar_hasta_nivel = $_POST["nivel"];
$comenzar_nivel_inferior = $_POST["comenzar_nivel_inferior"];
// $mostrar_hasta_nivel = 3;
global $nivel_directorio_raiz;
global $nivel_directorio;
$path = dirname(__FILE__);
if ($comenzar_nivel_inferior == "si") {
$path = substr($path, 0, strrpos($path, "/"));
}
$nivel_directorio_raiz = count(explode("/", $path)) - 1;
$numero_fila = 1;
// Comienzo de Tabla
echo "<table border='1' cellpadding='3' cellspacing='0'>";
// Fila encabezado
echo "<tr style='font-size: 100%; font-weight: bold;' bgcolor='#e2e2e2'><td></td><td>Ruta</td><td align='center'>Nivel</td><td align='right' style='color:#0000ff;'>Ficheros</td><td align='right'>Acumulado fich.</td><td align='right'>Directorio</td><td align='right' style='color:#0000ff;'>Tamaño</td><td align='right'>Acumulado tamaño</td></tr>";
// Inicio Filas de datos
echo "<tr>";
//Función que se invoca a si misma de forma recursiva según recorre el directorio raiz ($path)
FileCount($path, $mostrar_hasta_nivel, $nivel_directorio_raiz);
// Din Filas de datos
echo "</tr>";
// Fin de tabla
echo "</table>";
echo "<div style='font-size: 120%;'>";
echo "<br>Total ficheros en la ruta <b><em>" . $path . ":</em> " . number_format($count,0,",",".") . "</b><br>";
echo "Tamaño total ficheros: <b>". number_format($acumulado_tamanho, 0,",",".") . " Kb.</b><br>";
echo "</div>";
echo "<div style='min-height: 60px;'></div>";
} else {
?>
<form name="formulario" id="formulario" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<br /><h2>Informe del Alojamiento por directorios (Número de Archivos y Tamaño)</h2>
<br />Nivel de directorios a mostrar: <input type="text" name="nivel" id="nivel" value="3"><br /><br />
<input type="checkbox" name="comenzar_nivel_inferior" value="si" checked="checked"/> Comenzar en nivel de directorio inmediatamente inferior a la ubicación de este módulo PHP<br />(<?php echo dirname(__FILE__) ?>)<br /><br />
<input type="submit" name="comenzar" id="comenzar" value="Comenzar proceso"><br /><br />
</form>
<?php
}
function FileCount($dir, $mostrar_hasta_nivel, $nivel_directorio_raiz){
global $count;
global $count_anterior;
global $suma_tamanho;
global $acumulado_tamanho;
$arr=explode('&',$dir);
foreach($arr as $val){
global $ruta_actual;
if(is_dir($val) && file_exists($val)){
global $total_directorio;
global $numero_fila;
$total_directorio = 0;
$ob=scandir($val);
foreach($ob as $file){
if($file=="."||$file==".."){
continue;
}
$file=$val."/".$file;
if(is_file($file)){
$count++;
$suma_tamanho = $suma_tamanho + filesize($file)/1024;
$acumulado_tamanho = $acumulado_tamanho + filesize($file)/1024;
$total_directorio++;
} elseif(is_dir($file)){
FileCount($file, $mostrar_hasta_nivel, $nivel_directorio_raiz);
}
}
$nivel_directorio = count(explode("/", $val)) - 1;
if ($nivel_directorio > $mostrar_hasta_nivel) {
} else {
$atributo_fila = (($numero_fila%2)==1 ? "background-color:#ffffff;" : "background-color:#f2f2f2;");
echo "<tr style='".$atributo_fila."'><td>".$numero_fila."</td><td>".$val." </td><td align='center'>".$nivel_directorio."</td><td align='right' style='color:#0000ff;'>".number_format(($count - $count_anterior),0,",",".")."</td><td align='right'>".number_format($count,0,",",".")."</td><td align='right'>".number_format($total_directorio,0,",",".")."</td><td align='right' style='color:#0000ff;'>".number_format($suma_tamanho,0,",",".")." Kb.</td><td align='right'>".number_format($acumulado_tamanho,0,",",".")." Kb.</td></tr>";
$count_anterior = $count;
$suma_tamanho = 0;
$numero_fila++;
}
}
}
}
?>