Помогите разобраться, нужно подсчитать вес каталога, но функция не правильно работает. Дело в том что при вызове функции подсчитывается выделенное место на сервере, а не месте в каталоге. Т.е. в каталоге файлов на 4ГБ, а функция выводит вес в размере 250ГБ Код (Text): function Size2Str() { $size = disk_total_space("/home/login/domains/site/files/"); $kb = 1024; $mb = 1024 * $kb; $gb = 1024 * $mb; $tb = 1024 * $gb; if ($size < $kb) { return $size.' байт'; } else if ($size < $mb) { return round($size / $kb, 2).' Кб'; } else if ($size < $gb) { return round($size / $mb, 2).' Мб'; } else if ($size < $tb) { return round($size / $gb, 2).' Гб'; } else { return round($size / $tb, 2).' Тб'; } } Что не так делаю? Или может есть какие то альтернативы. Еще вопрос как будет лучше и правильнее, на высокопосещаемых сайтах, выводить вес данной функцией или прописывать вес каталога в базу данных и кроном обновлять значение?
функция работает правильно, вы просто не понимаете что делаете. для подсчета размера каталога всегда использовались костыли. гугл с запросом php directory size на вопросы ответим
спасибо, разобрался, все работает. Остается лишь вопрос, где хранить размер директории, функция как я понимаю не плохо грузит систему и для каждого пользователя подсчитывать данные думаю будет проблематично.
а насколько регулярно планируется сбор статистики? и кстати, если *nix - почему не отдать это утилитам? Код (Text): du -csb /home/*/ даст размер каждого каталога и суммарный размер (в байтах)
делай как Ganzal советует, кроном раз в сутки, результат пиши в текстовый файл Код (Text): du -csb /home/*/ >> dir_sizes.txt и парси этот файл на php..
а файл зачем? разве что разный для разных дат. а в любом другом случае - данные у тебя в базе останутся. не вижу смысла заводить отдельный нод в файловой системе Код (Text): du -csb /home/*/ | php -f /path/to/parser.php а в парсере прочитать STDIN и обновить базу ЗЫ вариант предложен основываясь на личном опыте - был у меня хостер, у которого напрочь закрыт вызов программ из php, но ничего не мешало выполнять что угодно по крону...
да можно и так, но я просто не сталкивался с таким, как вобще распарсить все это дело? Есть где мануальчик по этому?
начиная с какого момента затык? du возвратит все дело в формате, который можно прожевать регуляркой (\d+)\s(.*) - размер и путь соответственно. вы пробуйте, пробуйте. а с трудностями - поможем
ОФФ ради интереса попробовал http://www.php.ru/manual/function.disk-total-space.html#98050 запустил на хостинге, функция говорит что хостер меня наёпывает со свободным местом....кому не лень посмотрите, верно ли она все считает?
p.php Код (PHP): <?php while($s=fgets(STDIN)) { var_dump( $s*1024 ); } var_dump(disk_total_space('/home/')); var_dump(disk_free_space('/home/')); ?> запуск Код (Text): df -k | grep /home | awk '{print$2"\n"$4}' | php -f p.php вывод Код (Text): float(278761259008) float(155087466496) float(278761259008) float(155087466496) 1--3 и 2--4 попарно равны. а у вас какая проблема с результатами? Добавлено спустя 2 минуты 22 секунды: кстати о птичках. хостер может своим алгоритмом считать свободное место. дали квоту 1000мб. минус базы, временные файлы, порнуха админов - хостерский скрипт считает, а вы их не видите...
Помогите правильно вывести размер Вобщем юзаю эту функцию Код (Text): unction dirsize( $d ) { $dh = opendir( $d ); $size = 0; while( ( $f = readdir( $dh ) ) !== false ) { if ( $f != "." && $f != ".." ) { $path = $d . "/" . $f; if( is_dir( $path ) ) { $size += dirsize( $path ); } elseif( is_file( $path ) ) { $size += filesize( $path ); } } } closedir($dh); return $size; } $size = round( dirsize("./") / 1024 , 2 ); проблема вся в том что гигобайты она выводит так 2579683.09 А нужно так 2 579 683.09 Можно ли так как то сделать?