75 Stimmen

Wie man die Verzeichnisgröße in PHP ermittelt

function foldersize($path) {
  $total_size = 0;
  $files = scandir($path);

  foreach($files as $t) {
    if (is_dir(rtrim($path, '/') . '/' . $t)) {
      if ($t<>"." && $t<>"..") {
          $size = foldersize(rtrim($path, '/') . '/' . $t);

          $total_size += $size;
      }
    } else {
      $size = filesize(rtrim($path, '/') . '/' . $t);
      $total_size += $size;
    }
  }
  return $total_size;
}

function format_size($size) {
  $mod = 1024;
  $units = explode(' ','B KB MB GB TB PB');
  for ($i = 0; $size > $mod; $i++) {
    $size /= $mod;
  }

  return round($size, 2) . ' ' . $units[$i];
}

$SIZE_LIMIT = 5368709120; // 5 GB

$sql="select * from users order by id";
$result=mysql_query($sql);

while($row=mysql_fetch_array($result)) {
  $disk_used = foldersize("C:/xampp/htdocs/freehosting/".$row['name']);

  $disk_remaining = $SIZE_LIMIT - $disk_used;
  print 'Name: ' . $row['name'] . '<br>';

  print 'diskspace used: ' . format_size($disk_used) . '<br>';
  print 'diskspace left: ' . format_size($disk_remaining) . '<br><hr>';
}

php disk_total_space

Haben Sie eine Idee, warum die Prozessorauslastung zu hoch oder auf 100% ansteigt, bis die Skriptausführung beendet ist? Kann man irgendetwas tun, um es zu optimieren? Oder gibt es eine andere Möglichkeit, die Größe von Ordnern und darin enthaltenen Verzeichnissen zu überprüfen?

3voto

farza Punkte 21

Wenn Sie auf Linux gehostet werden:

passthru('du -h -s ' . $DIRECTORY_PATH)

Es ist besser als foreach

2voto

Fernando Punkte 1118

PHP get directory size (mit FTP-Zugang)

Nach harter Arbeit funktioniert dieser Code großartig!!!! und ich möchte ihn mit der Gemeinschaft teilen (von MundialSYS)

function dirFTPSize($ftpStream, $dir) {
    $size = 0;
    $files = ftp_nlist($ftpStream, $dir);

    foreach ($files as $remoteFile) {
        if(preg_match('/.*\/\.\.$/', $remoteFile) || preg_match('/.*\/\.$/', $remoteFile)){
            continue;
        }
        $sizeTemp = ftp_size($ftpStream, $remoteFile);
        if ($sizeTemp > 0) {
            $size += $sizeTemp;
        }elseif($sizeTemp == -1){//directorio
            $size += dirFTPSize($ftpStream, $remoteFile);
        }
    }

    return $size;
}

$hostname = '127.0.0.1'; // or 'ftp.domain.com'
$username = 'username';
$password = 'password';
$startdir = '/public_html'; // absolute path
$files = array();
$ftpStream = ftp_connect($hostname);
$login = ftp_login($ftpStream, $username, $password);
if (!$ftpStream) {
    echo 'Wrong server!';
    exit;
} else if (!$login) {
    echo 'Wrong username/password!';
    exit;
} else {
    $size = dirFTPSize($ftpStream, $startdir);
}

echo number_format(($size / 1024 / 1024), 2, '.', '') . ' MB';

ftp_close($ftpStream);

Guter Code! Fernando

2voto

Douglas Leeder Punkte 50423

Es gibt verschiedene Möglichkeiten, das Skript zu optimieren - am erfolgreichsten wäre es jedoch, wenn es IO-gebunden und nicht CPU-gebunden wäre:

  1. Calcular rtrim($path, '/') außerhalb der Schleife.
  2. machen. if ($t<>"." && $t<>"..") der äußere Test - er muss den Pfad nicht angeben
  3. Calcular rtrim($path, '/') . '/' . $t einmal pro Schleife - innerhalb von 2) und unter Berücksichtigung von 1).
  4. Calcular explode(' ','B KB MB GB TB PB'); einmal und nicht bei jedem Aufruf?

2voto

M J Punkte 11

Was das Linux-Beispiel von Johnathan Sampson betrifft, so müssen Sie aufpassen, wenn Sie eine intval-Analyse des Ergebnisses der Funktion "du" durchführen. Wenn die Größe >2GB ist, wird weiterhin 2GB angezeigt.

Ersetzen:

$totalSize = intval(fgets($io, 80));

von:

strtok(fgets($io, 80), " ");

angenommen, Ihre "du"-Funktion gibt die Größe, getrennt durch ein Leerzeichen, gefolgt von dem Verzeichnis-/Dateinamen zurück.

2voto

hugsbrugs Punkte 3251

Objektorientierter Ansatz :

/**
 * Returns a directory size
 *
 * @param string $directory
 *
 * @return int $size directory size in bytes
 *
 */
function dir_size($directory)
{
    $size = 0;
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file)
    {
        $size += $file->getSize();
    }
    return $size;
}

Schnelle und rasante Annäherung :

function dir_size2($dir)
{
    $line = exec('du -sh ' . $dir);
    $line = trim(str_replace($dir, '', $line));
    return $line;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X