Соорудил следующую функцию для определения размера средствами 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 комментария:
Вот ещё способ:
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.";
}
на счет быстродействия не знаю, не проверял. Этот вариант скорее подойдёт для папок с небольшим количеством файлов.
Не учитывается вес папок, если в каталоге много подпапок, их вес может повлиять.
Я сделал вот так:
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 секунды, лол, но у меня достаточно глубокая вложенность
Отправить комментарий