Php скрипт размер папки

Как получить размер каталога в PHP

php disk_total_space Любая идея, почему использование процессора увеличивается слишком высоко или на 100% до завершения выполнения script? Можно ли что-то сделать для его оптимизации? или есть ли другой альтернативный способ проверки папки и папок внутри него?

15 ответов

getfolder ( $f ); echo 'Directory: ' . $f . ' => Size: ' . $ref->size; $obj = null; > else < echo 'can not create object'; >?> 

Когда я пытаюсь сделать это на хосте Windows, у меня появляется ошибка: Fatal error: Class ‘COM’ not found .

@vertigoelectric Убедитесь, что вы включили COM и .NET DLL в своем INI-файле. Смотрите комментарии на php.net/manual/en/book.com.php для получения дополнительной информации.

Обратите внимание, что опция Linux может дать вам нежелательные результаты, см. Этот вопрос и ответы .

function GetDirectorySize($path)< $bytestotal = 0; $path = realpath($path); if($path!==false && $path!='' && file_exists($path))< foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS)) as $object)< $bytestotal += $object->getSize(); > > return $bytestotal; > 

Та же идея, что и Дженит Чинтанана. С несколькими исправлениями:

  • Преобразует $path в realpath
  • Выполняет итерацию только в том случае, если путь действителен и существует папка
  • Пропускает . и .. файлы
  • Оптимизирован для производительности

оба они вызвали исключение Runtime, когда натолкнулись на сломанные символические ссылки для меня. Простая попытка / $bytestotal += $object->getSize(); вокруг $bytestotal += $object->getSize(); решил это для меня.

если папка пуста, код возвращает ошибку Uncaught исключения «UnexpectedValueException» с сообщением «RecursiveDirectoryIterator ::

Работает как для Linux, так и для Windows, папка не существует возвращает 0, а если пустая папка возвращает 0, не знаю, почему @gr68 gr68 имеет проблемы, я думаю, что это должен быть одобренный ответ.

Возможно, gr68 имел в виду, когда переменная $ path пуста. Недавно я увидел, как RecursiveDirectoryIterator выдает ошибку по пустому пути, поэтому на всякий случай я принял код для проверки существования папки.

Я проголосовал за этот пост, потому что он отвечает на вопрос, но я думаю, что его требование быть оптимизированным для производительности не выполнено.

@user10089632 user10089632 Вы правы с определенной точки зрения. У него нет видимых «оптимизаций». Может быть, я должен был оставить это требование. Но я хотел, чтобы люди каким-то образом знали, что я на самом деле измерил и сравнил производительность множества различных синтаксисов и подходов, и этот точный код оказался самым быстрым.

@Programster Игнорирование исключений, на мой взгляд, не слишком элегантное решение . Но вы можете заменить этот блок try <> catch() на условный оператор, где вы проверяете текущий элемент, если он (обычный) файл: if ( $object->isFile() ) < $bytestotal += $object->getSize(); >

Читайте также:  Check if string is in file python

это по-прежнему занимает около 81 секунды с каталогом размером до 2,1 ГБ в Windows по сравнению с использованием $obj = new \COM(‘scripting.filesystemobject’); который делает это примерно за 1,8 секунды

[email protected]"); $disk_remaining = $SIZE_LIMIT - $disk_used; echo(""); echo('diskspace used: ' . format_size($disk_used) . '
'); echo( 'diskspace left: ' . format_size($disk_remaining) . '

'); echo(""); function foldersize($path) < $total_size = 0; $files = scandir($path); $cleanPath = rtrim($path, '/'). '/'; foreach($files as $t) < if ($t<>"." && $t<>"..") < $currentFile = $cleanPath . $t; if (is_dir($currentFile)) < $size = foldersize($currentFile); $total_size += $size; >else < $size = filesize($currentFile); $total_size += $size; >> > return $total_size; > function format_size($size) < global $units; $mod = 1024; for ($i = 0; $size >$mod; $i++) < $size /= $mod; >$endIndex = strpos($size, ".")+3; return substr( $size, 0, $endIndex).' '.$units[$i]; > ?>

@brasofilo Операция закончила вопрос с «или есть какой-нибудь другой альтернативный способ проверить папку и папки внутри ее размера?» Это альтернативный способ. Если этот код используется, проблемы использования процессора с исходным кодом оператора не имеют значения. 😉

Спасибо за отзыв, vdbuilder. Я просто пропустил некоторые текстовые объяснения о том, почему ваш код оптимизирован . Как я использовал его, чтобы ответить на этот вопрос WordPress : о)

Это работает с любой платформой, имеющей версию php 5 или более поздней версии.

** * Get the directory size * @param directory $directory * @return integer */ function dirSize($directory) < $size = 0; foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file)< $size+=$file->getSize(); > return $size; > 

Я нашел ошибку в вашем коде, эта функция добавляет размер директории ‘..’. Итак, вы должны ограничить его следующим образом: if($file -> getFileName() != ‘..’) $size += $file -> getSize();

function get_dir_size($directory) < $size = 0; $files= glob($directory.'/*'); foreach($files as $path)< is_file($path) && $size += filesize($path); is_dir($path) && get_dir_size($path); >return $size; > 

Благодаря Джонатану Сэмпсону, Адаму Пирсу и Джениту Чинтане я сделал это, проверяя наиболее эффективный способ получить размер каталога. Должен работать на хостах Windows и Linux.

static function getTotalSize($dir) < $dir = rtrim(str_replace('\\', '/', $dir), '/'); if (is_dir($dir) === true) < $totalSize = 0; $os = strtoupper(substr(PHP_OS, 0, 3)); // If on a Unix Host (Linux, Mac OS) if ($os !== 'WIN') < $io = popen('/usr/bin/du -sb ' . $dir, 'r'); if ($io !== false) < $totalSize = intval(fgets($io, 80)); pclose($io); return $totalSize; >> // If on a Windows Host (WIN32, WINNT, Windows) if ($os === 'WIN' && extension_loaded('com_dotnet')) < $obj = new \COM('scripting.filesystemobject'); if (is_object($obj)) < $ref = $obj->getfolder($dir); $totalSize = $ref->size; $obj = null; return $totalSize; > > // If System calls did't work, use slower PHP 5 $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir)); foreach ($files as $file) < $totalSize += $file->getSize(); > return $totalSize; > else if (is_file($dir) === true) < return filesize($dir); >> 

+1 для самого быстрого решения с несколькими хостами. Но должны ли проверки ОС быть такими, как if ($ os! == ‘WIN’ && $ os! == ‘Win’) и elseif (extension_loaded (‘com_dotnet’))

Читайте также:  Php mysql вывод результата запроса

лучший оптимизированный ответ до сих пор занимает около 1.3 secs чтобы вычислить dir около 2.16 GB с приблизительно 81,043 Files и 16 16,713 Folders по сравнению с рекурсивным итератором, который спит около 80 secs (ON WINDOWS)

Пример Johnathan Sampson Linux для меня не так хорош. Здесь улучшенная версия:

Несмотря на то, что на этот пост уже много ответов, я чувствую, что мне нужно добавить еще один вариант для хостов unix, который возвращает сумму всех размеров файлов в каталоге (рекурсивно).

Если вы посмотрите на ответ Джонатана, он использует команду du . Эта команда вернет общий размер каталога, но чистые PHP-решения, размещенные другими пользователями, вернут сумму всех размеров файлов. Большая разница!

Что нужно искать

При запуске du во вновь создаваемом каталоге он может возвращать 4K вместо 0 . Это может даже стать более запутанным после удаления файлов из рассматриваемого каталога, указав du общий размер каталога, который не соответствует сумме размеров файлов внутри него. Зачем? Команда du возвращает отчет на основе некоторых настроек файла, так как Hermann Ingjaldsson прокомментировал этот пост.

Решение

Чтобы сформировать решение, которое ведет себя как некоторые скрипты только для PHP, вы можете использовать команду ls и передать ее в awk следующим образом:

ls -ltrR /path/to/dir |awk ''|awk 'BEGIN  END ' 

В качестве функции PHP вы можете использовать что-то вроде этого:

function getDirectorySize( $path ) < if( !is_dir( $path ) ) < return 0; >$path = strval( $path ); $io = popen( "ls -ltrR |awk ''|awk 'BEGIN  END '", 'r' ); $size = intval( fgets( $io, 80 ) ); pclose( $io ); return $size; > 

Источник

Php скрипт размер папки

На обычном shared-хостинге в файл-менеджере указаны размеры только файлов, но не директорий. Также программы FTP выдают только размеры файлов, но не директорий. Но очень част о нужно узнать, какая же папка (директория) у нас увеличилась, чтобы принять меры по ее очищению или оптимизации.

Ниже указан скрипт PHP, который может выводить директории с размерами от корня сайта или от определенной директории, или сразу всё вместе с файлами и без них.

От нас требуется создать по FTP или через файл-менеджер файл .php, вставить в него наш код и запустить. В коде есть комментарии, надеемся, там все понятно.

> > closedir($dirstream); return $totalsize; > // функция для просмотра всех подпапок и всех вложенных файлов function getFileList($dir, $recurse=false, $depth=false, $withfiles=false) < // массив, хранящий возвращаемое значение $retval = array(); // добавить конечный слеш, если его нет if(substr($dir, -1) != "/") $dir .= "/"; // указание директории и считывание списка файлов $d = @dir($dir) or die("getFileList: Не удалось открыть каталог $dir для чтения"); while(false !== ($entry = $d->read())) < // пропустить скрытые файлы if($entry[0] == ".") continue; if(is_dir("$dir$entry")) < $size = dir_size("$dir$entry"); $retval[] = array( "name" =>«$dir$entry/», «size» => $size, «lastmod» => filemtime(«$dir$entry») ); if($recurse && is_readable(«$dir$entry/»)) < if($depth === false) < $retval = array_merge($retval, getFileList("$dir$entry/", true)); >elseif($depth > 0) < $retval = array_merge($retval, getFileList("$dir$entry/", true, $depth-1)); >> > elseif(is_readable(«$dir$entry»)) < if($withfiles) < $retval[] = array( "name" =>«$dir$entry», «size» => filesize(«$dir$entry»), «lastmod» => filemtime(«$dir$entry») ); > > > $d->close(); return $retval; > // массив значений указывая параметры директория (например ./upload/ или ./ — от корня сайта), рекурсивно или нет, уровень вложенности, с файлами или только директории $dirlist = getFileList(«./», true, 0, false); $data_size=array(); foreach($dirlist as $key=>$arr) < $data_size[$key]=$arr['size']; >//Сортируем массив по размерам для удобства чтения array_multisort($data_size, SORT_NUMERIC, $dirlist); ?> td, th

Читайте также:  Css получить высоту другого блока

‘; > ?>

Название Размер Дата изменения
‘.$student[‘name’].’ ‘.round($student[‘size’]/1048576, 4).’ Мб’.’ ‘.date(‘d/m/Y g:i A’, $student[‘lastmod’]).’

Источник

Как определить размер папки

Здравствуйте, формучане Пытаюсь определить размер папки скриптом php, но выходит довольно туго. Пробовал 2 способа — рекурсивно спускаться в подкаталоги и суммировать размеры попутных файлов и через системный вызов du. В обоих случаях потерпел фиаско: в случае рекурсии либо не работает $handle = opendir ($path), возвращает null, хотя папка существует. Скорее всего это было связано с правами, выдавать полные права на папку не самая лучшая идея, но даже если их выдать is_file ($nextpath) всегда возвращает false, если убрать это условие, то не определяется размер файла filesize ($nextpath), хотя все права на файл стоят.
В случае exec вообще происходит какая-то магия. Из-под консоли запускаю «du -bcS /home/gs24» работает нормально, расписывает всё, что лежит внутри с размерами + размер всей запрашиваемой папки. Пишу то же самое через exec — получаю всего 2 строчки «Array ( [0] => 4096 /home/gs24 [1] => 4096 total )» ?
Может есть какой-то менее костыльный метод определить размер папки, чтобы не мучиться с правами и магией системных вызовов?

Код, про который идёт речь:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
function getDirectorySize($path) { echo $path."
"
; $totalsize = 0; $totalcount = 0; $dircount = 0; if ($handle = opendir ($path)) { echo $path."
"
; while (false !== ($file = readdir($handle))) { $nextpath = $path . '/' . $file; echo "$nextpath
"
; 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; }
$path = "/home/gs"; $path .= $id; $com = "du -bcS " . $path; exec($com, $mas); print_r($mas);

Источник

Оцените статью