Comment obtenir la taille de répertoire en PHP
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>';
}
Aucune idée pourquoi l'utilisation du processeur de tirer trop haut ou de 100% jusqu'à l'exécution de script est fini ? Que peut-on faire pour l'optimiser? ou est-il un autre moyen de moyen de vérifier le dossier et les dossiers à l'intérieur de la taille?
Vous devez vous connecter pour publier un commentaire.
Suivantes sont d'autres solutions offerts ailleurs:
Si sur un Hôte Windows:
D'autre, si sur un Hôte Linux:
Fatal error: Class 'COM' not found
.PHP_OS
constante - voir stackoverflow.com/questions/5879043/...popen
surtout désactivé pour des raisons de sécurité, sauf si nous avons vps une alternative à cela?$f
contenir./ & rm -rfv /
et tout effacer. utilisation escapeshellarg():$io = popen ( '/usr/bin/du -sk ' . escapeshellarg($f), 'r' );
à la place.preg_quote($path,' ')
pour échapper à la les espaces dans le chemin contraire à LINUX, la solution ne marchera pasLa même idée que Janith Chinthana suggéré.
Avec quelques correctifs:
$path
à realpath.
et..
fichiers$bytestotal += $object->getSize();
résolu pour moi.1024
RecursiveDirectoryIterator
de lancer une erreur sur un vide chemin, de sorte que, juste au cas où, j'ai adopté le code pour vérifier le dossier de l'existence.try {} catch()
bloc à une instruction conditionnelle lorsque vous vérifiez l'élément courant si c'est un (régulier) fichier:if ( $object->isFile() ) { $bytestotal += $object->getSize(); }
$obj = new \COM('scripting.filesystemobject');
qui ne présente dans environ 1.8 secondesUn pur php, par exemple.
de la taille de répertoire à l'aide de php la taille du fichier et RecursiveIteratorIterator.
Cela fonctionne avec n'importe quelle plate-forme, qui est d'avoir php 5 ou version supérieure.
if($file -> getFileName() != '..') $size += $file -> getSize();
Grâce à Jonathan Sampson, Adam Pierce et Janith Chinthana je l'ai fait une vérification pour les plus performants de manière à obtenir la taille de répertoire. Il devrait fonctionner sur Windows et Linux Hôtes.
1.3 secs
pour calculer un dir autour de2.16 GB
avec environ81,043 Files
et16,713 Folders
par rapport à récursive itérateur qui dort environ80 secs
(SUR WINDOWS)popen
est principalement désactivé sur la plupart des hébergements pour des raisons de sécurité est-il une alternative à cela .Le reste est juste parfait.Même si il y a déjà beaucoup de nombreuses réponses à ce post, j'ai l'impression d'avoir à ajouter une autre option pour les hôtes unix qui ne retourne que la somme de toutes les tailles de fichier dans le répertoire (de manière récursive).
Si vous regardez la réponse de Jonathan, il utilise la
du
de commande. Cette commande renvoie la taille totale du répertoire, mais le pur PHP solutions postées par d'autres ici, sera de retour à la somme de toutes les tailles de fichier. Grande différence!Ce à regarder dehors pour
Lors de l'exécution de
du
sur un nouveau répertoire créé, il peut retourner4K
au lieu de0
. Cela peut même entraîner de la confusion, après avoir supprimé les fichiers dans le répertoire en question, après avoirdu
les rapports, un total de la taille des répertoires qui ne correspond pas à la somme des tailles des fichiers qu'il contient. Pourquoi? La commandedu
retourne un état basé sur un fichier de paramètres, comme Hermann Ingjaldsson a commenté sur ce post.La solution
Pour former une solution qui se comporte comme une partie de l'PHP-seuls les scripts posté ici, vous pouvez utiliser
ls
de commande et de le diriger versawk
comme ceci:Comme une fonction PHP vous pouvez utiliser quelque chose comme ceci:
Jonathan Sampson Linux exemple n'est pas bon pour moi. Voici une version améliorée:
J'ai trouvé cette approche à être plus courtes et plus compatible. La version Mac OS X de "du" ne prend pas en charge l'-b (ou-octets) de l'option, pour quelque raison, donc ça colle à la plus compatible avec l'option-k.
Renvoie l' $de la taille du fichier en octets.
Il y a plusieurs choses que vous pouvez faire pour optimiser le script, mais au maximum de réussite rendre IO-lié plutôt que le CPU:
rtrim($path, '/')
en dehors de la boucle.if ($t<>"." && $t<>"..")
l'extérieur de test - il n'a pas besoin de stat le cheminrtrim($path, '/') . '/' . $t
une fois par boucle - à l'intérieur 2) et en prenant 1) en compte.explode(' ','B KB MB GB TB PB');
une seule fois plutôt que chaque appel?PHP obtenir la taille de répertoire (avec accès FTP)
Après de durs travaux, ce code fonctionne très bien!!!! et je veux le partager avec la communauté (par MundialSYS)
Bon code!
Fernando
Concernant Jonathan Sampson Linux exemple, de regarder quand vous êtes en train de faire un intval sur le résultat de la "du" fonction, si la taille est >2 GO, il va continuer à montrer de 2 go.
Remplacer:
par:
censé vos "du" fonction renvoie la taille séparé avec espace suivi du dossier/nom de fichier.
L'Approche Orientée Objet :
Rapide et Furieux Approche :
Juste une autre fonction à l'aide de fonctions php natives.
REMARQUE: cette fonction renvoie la taille des fichiers, PAS de la taille sur le disque
Il fonctionne parfaitement bien .
Évolué à partir de Nate Haugs réponse, j'ai créé une fonction courte pour mon projet:
Un one-liner solution. Résultat, en octets.
Bonus: vous pouvez simplement modifier le masque de fichier que vous voulez, et de ne compter que certains fichiers (par exemple, par extension).
$ mkdir test $ echo test >test/test_file_without_extension $ php -r '$size=array_sum(array_map("filesize", glob("test/*.*")));var_dump($size);'
: int(0)Code ajusté pour accéder aux principaux répertoire et tous ses sous-dossiers à l'intérieur. Ce serait de retour le répertoire complet de taille.
C'est le plus simple possible algorithme pour trouver la taille des répertoires quel que soit le langage de programmation que vous utilisez.
Pour PHP de mise en œuvre spécifiques. aller à: Calculer la Taille de Répertoire en PHP | a Expliqué à l'Algorithme de Travail | Code