За последние 24 часа нас посетили 17465 программистов и 1722 робота. Сейчас ищет 931 программист ...

Функция disk_total_space не правильно работает

Тема в разделе "PHP и базы данных", создана пользователем viphost, 13 фев 2012.

  1. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    Помогите разобраться, нужно подсчитать вес каталога, но функция не правильно работает. Дело в том что при вызове функции подсчитывается выделенное место на сервере, а не месте в каталоге. Т.е. в каталоге файлов на 4ГБ, а функция выводит вес в размере 250ГБ
    Код (Text):
    1. function Size2Str()
    2. {
    3. $size = disk_total_space("/home/login/domains/site/files/");
    4.     $kb = 1024;
    5.     $mb = 1024 * $kb;
    6.     $gb = 1024 * $mb;
    7.     $tb = 1024 * $gb;
    8.  
    9.     if ($size < $kb) {
    10.         return $size.' байт';
    11.     } else if ($size < $mb) {
    12.         return round($size / $kb, 2).' Кб';
    13.     } else if ($size < $gb) {  
    14.         return round($size / $mb, 2).' Мб';
    15.     } else if ($size < $tb) {
    16.         return round($size / $gb, 2).' Гб';
    17.     } else {
    18.         return round($size / $tb, 2).' Тб';
    19.     }
    20. }
    Что не так делаю? Или может есть какие то альтернативы.
    Еще вопрос как будет лучше и правильнее, на высокопосещаемых сайтах, выводить вес данной функцией или прописывать вес каталога в базу данных и кроном обновлять значение?
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    функция работает правильно, вы просто не понимаете что делаете.
    для подсчета размера каталога всегда использовались костыли. гугл с запросом php directory size
    на вопросы ответим
     
  3. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    спасибо, разобрался, все работает. Остается лишь вопрос, где хранить размер директории, функция как я понимаю не плохо грузит систему и для каждого пользователя подсчитывать данные думаю будет проблематично.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а насколько регулярно планируется сбор статистики?
    и кстати, если *nix - почему не отдать это утилитам?
    Код (Text):
    1. du -csb /home/*/
    даст размер каждого каталога и суммарный размер (в байтах)
     
  5. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    сбор статистики будет проходить раз в сутки, или раз в трое суток
     
  6. yuri

    yuri Активный пользователь

    С нами с:
    16 янв 2012
    Сообщения:
    288
    Симпатии:
    2
    делай как Ganzal советует, кроном раз в сутки, результат пиши в текстовый файл
    Код (Text):
    1. du -csb /home/*/ >> dir_sizes.txt
    и парси этот файл на php..
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а файл зачем? разве что разный для разных дат. а в любом другом случае - данные у тебя в базе останутся. не вижу смысла заводить отдельный нод в файловой системе
    Код (Text):
    1. du -csb /home/*/ | php -f /path/to/parser.php
    а в парсере прочитать STDIN и обновить базу

    ЗЫ вариант предложен основываясь на личном опыте - был у меня хостер, у которого напрочь закрыт вызов программ из php, но ничего не мешало выполнять что угодно по крону...
     
  8. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    да можно и так, но я просто не сталкивался с таким, как вобще распарсить все это дело? Есть где мануальчик по этому?
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    начиная с какого момента затык? du возвратит все дело в формате, который можно прожевать регуляркой (\d+)\s(.*) - размер и путь соответственно. вы пробуйте, пробуйте. а с трудностями - поможем
     
  10. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    ОФФ ради интереса попробовал
    http://www.php.ru/manual/function.disk-total-space.html#98050
    запустил на хостинге, функция говорит что хостер меня наёпывает со свободным местом....кому не лень посмотрите, верно ли она все считает?
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    p.php
    Код (PHP):
    1. <?php
    2. while($s=fgets(STDIN))
    3. {
    4. var_dump( $s*1024 );
    5. }
    6. ?>
    запуск
    Код (Text):
    1. df -k | grep /home | awk '{print$2"\n"$4}' | php -f p.php
    вывод
    Код (Text):
    1. float(278761259008)
    2. float(155087466496)
    3. float(278761259008)
    4. float(155087466496)
    1--3 и 2--4 попарно равны.

    а у вас какая проблема с результатами?

    Добавлено спустя 2 минуты 22 секунды:
    кстати о птичках. хостер может своим алгоритмом считать свободное место. дали квоту 1000мб. минус базы, временные файлы, порнуха админов - хостерский скрипт считает, а вы их не видите...
     
  12. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    да, сори, БД то я не посчитал, тогда все верно получается...спасибо!
     
  13. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    Помогите правильно вывести размер
    Вобщем юзаю эту функцию
    Код (Text):
    1. unction dirsize( $d )
    2.  {
    3.   $dh = opendir( $d );
    4.   $size = 0;
    5.   while( ( $f = readdir( $dh ) ) !== false )
    6.    {
    7.     if ( $f != "." && $f != ".." )
    8.      {
    9.       $path = $d . "/" . $f;
    10.       if( is_dir( $path ) )
    11.        {  $size += dirsize( $path );  }
    12.       elseif( is_file( $path ) )
    13.        {  $size += filesize( $path );  }
    14.      }
    15.    }
    16.   closedir($dh);
    17.   return $size;
    18.  }
    19.  
    20.  $size = round( dirsize("./") / 1024 , 2 );
    проблема вся в том что гигобайты она выводит так
    2579683.09
    А нужно так
    2 579 683.09

    Можно ли так как то сделать?
     
  14. Dmitriy A. Arteshuk

    Dmitriy A. Arteshuk Активный пользователь

    С нами с:
    19 янв 2012
    Сообщения:
    2.445
    Симпатии:
    66
    Адрес:
    Зеленоград
    попробуй number_format($size, 2, '.', ' ');
     
  15. viphost

    viphost Активный пользователь

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    спасибо, так и нужно