среда, 2 апреля 2008 г.

Определение размера папки в php

Вот на форуме задали вопрос как определить размер файлов в папке и во всех ее подпапках на php.
Соорудил следующую функцию для определения размера средствами php
function getFilesSize($path)
{
$fileSize = 0;
$dir = scandir($path);

foreach($dir as $file)
{
if (($file!='.') && ($file!='..'))
if(is_dir($path . '/' . $file))
$fileSize += getFilesSize($path.'/'.$file);
else
$fileSize += filesize($path . '/' . $file);
}

return $fileSize;
}

И решил испытать быстродействие сего решения:
При размере папки 9856140939 байт и общем количестве файлов 58784
getFilesSize работает 1.65301918983 сек.
В голову пришел другой вариант, если позволяет хостер и на сервере установлен *nix то получить размер можно стандартной системной утилитой du, вызвав ее при помощи exec()
Получаем exec('du -bcS ' . $myDir) при всех техже условиях работает 0.278401136398 сек

3 комментария:

RED комментирует...

Вот ещё способ:
function dirSize($dir){
$fs = 0;
$pach = array();
$pach = scandir($dir);
for($i=2;$i<=count($dir);$i++){
$fs += filesize($dir[$i]);
}
$fs /= 1024;
$fs = (int)$fs;

echo "Размер папки $dir = $fs Kb.";
}

на счет быстродействия не знаю, не проверял. Этот вариант скорее подойдёт для папок с небольшим количеством файлов.

Unknown комментирует...
Этот комментарий был удален автором.
Unknown комментирует...

Не учитывается вес папок, если в каталоге много подпапок, их вес может повлиять.
Я сделал вот так:

public function getDirectorySize(string $folderPath): int
{
$files = scandir($folderPath);
unset($files[0], $files[1]);
$size = 0;
foreach ($files as $file) {
if (file_exists($folderPath . '/' . $file)) {
$size += filesize($folderPath . '/' . $file);
if (is_dir($folderPath . '/' . $file)) {
$size += $this->getDirectorySize($folderPath . '/' . $file);
}
}

}

return $size;
}

Про быстродействие сказать нечего, 10МБ за 3 секунды, лол, но у меня достаточно глубокая вложенность