メンバーメニュー

ようこそ、ゲストさん

トップ > カテゴリ一覧 > ミニバード > ディスク容量

質問

  • ディスク容量
  • 本文:

    PHPで残りディスク容量を知るにはどうしたらいいのでしょうか?
    disk_free_space()では得られませんでした。

  • 緊急度:通常投稿者:みっくさん投稿時間:2012/09/12 00:38
質問に対する回答は締め切られました

回答 No.1022

  • この回答がベストアンサーです

  • 本文:

    ファイルのオーナーが誰になっているかにもよりますが、契約毎の容量は quota で設定しているはずですので、unix コマンドなら quota -u で使用量も分かります。

    ディレクトリ毎の使用容量を調べるには、du コマンドで可能です。
    du -s /home/user など。

    php と quota や du で検索するとヒントがあるかもと思ってみたら、あまりないようですね。

    http://forum.powweb.com/archive/index.php/t-74127.html
    ↑ここはどうですか?

    exec() が使えるなら動くかも。

  • 投稿者:エイブルさん 投稿時間:2012/09/14 12:06
質問者からのコメント

エイブルさん、回答ありがとうございます。
この手がありましたね!

早速やってみたところ、exec()でquotaを実行できました。
ばっちりアカウント情報のページのものと同じ値が取得できました。

これにて解決として、質問を締め切らせて頂きます。
皆さんありがとうございました!

回答 No.983

  • 本文:

    <?php
    $disk_space = disk_free_space();
    echo $disk_space."バイト空き";
    ?>

    ↓ これでお試し下さい。


    <?php
    $disk_space = disk_free_space('/home/サーバーID/example.come');
    echo $disk_space."バイト空き";
    ?>



  • 投稿者:アナログ親父さん 投稿時間:2012/09/12 01:11
質問者からのコメント

回答ありがとうございます。

助言どおりにすると確かに数値が取得できました。
が、得られた数値は1.3Tバイトくらいで私の期待したものではなさそうです。

質問のしかたが不十分だったですね。
私が知りたいのはアカウントで使用できる残容量です。
サーバー管理ツール→アカウント情報→ディスク容量に表示されている2つの数値の差が知りたいんです。

以下などもやってみましたが、やはり1.3Tバイトくらいの値でした。
disk_free_space('/home/[サーバーID]/[ドメイン名]/public_html')

引数に問題があるんでしょうか?

回答 No.1017

  • 本文:

    私の早とちりだったかも (;´∀`)

    disk_free_space() このスクリプトはディスクの空き容量を調べるものですからユーザー領域は /home のはず。1.5TB がそれに該当しそうです。

    1,/home
    2,/home/サーバーID

    ほぼ同じ数字を返しますね。

    2の場合はサーバーIDはパーティションというよりディレクトリという表現の方がより正確な気がします。ユーザーに割り当てられているのはハードディスクの使用制限をするツール quota あたりで割り振られた領域に過ぎませんから、うまくいかない原因がそこいらあたりに有りそうですね。

    いっそ FTP あたりで使用量を計算してくれるアプリがありそうですね。以前は確か存在してました。

    残念ながら引数に心当たりがありません。あしからず。どなたかご存じの方おみえになられたらヘルププリーズ!

    (;・∀・)

  • 投稿者:アナログ親父さん 投稿時間:2012/09/12 11:32

回答 No.1019

  • 本文:

    (私はプログラマでないので、色々ツッコミ所あるとおもいますが気にしないでください(;^ω^))
    ひとつのスペースあたりの割り当てがわかっているので、
    <?php
    function format_bytes($bytes) {
    if ($bytes < 1024) return $bytes.' B';
    elseif ($bytes < 1048576) return round($bytes / 1024, 2).' KB';
    elseif ($bytes < 1073741824) return round($bytes / 1048576, 2).' MB';
    elseif ($bytes < 1099511627776) return round($bytes / 1073741824, 2).' GB';
    else return round($bytes / 1099511627776, 2).' TB';
    }
    function dirSize($directory) {
    $size = 0;
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file){
    $size+=$file->getSize();
    }
    return $size;
    }
    $dir = '/home/ほにゃらら/';//doc√
    $quota = 'ほにゃらら';//割り当て
    $usesize = dirSize($dir);//現在使っているサイズ
    $freesize = $quota-$usesize;//割り当てから使用分を引きます
    echo 'quota:'.format_bytes($quota).','.$quota.'bytes<br>';
    echo 'use:'.format_bytes($usesize).','.$usesize.'bytes<br>';
    echo 'free:'.format_bytes($freesize).','.$freesize.'bytes';
    ?>
    とすればできると思います。
    割り当ては
    ミニバードなら30GBなので32212254720でおっけーです。
    2つのfunctionは
    http://php.net/manual/ja/function.filesize.php
    から転載しました。
    で、実際に試したところ誤差が大きかったです。
    useが+100MB〜+5MBくらい誤差が発生していました。
    スペースの中に入ってるデータが多ければ多いほど大きな誤差になっているようです(´・ω・`)。

  • 投稿者:-さん 投稿時間:2012/09/13 15:10

回答 No.1020

  • 本文:

    データベース等も足してみたのですが、それでも誤差があるようです。
    アナログ親父さんがおっしゃっていたFTPソフトで計測についてですが、WinSCPで試したところ、PHPの出力とまったく一緒でした。

    私はスタードメインしか契約していないのでスタードメインプラスの結果です。もしかしたらミニバードだと違う結果になるかもしれません。

  • 投稿者:-さん 投稿時間:2012/09/13 15:28
質問者からのコメント

わざわざプログラムをありがとうございます。
ミニバードでやってみましたが、同じ結果になりました。
誤差はちょっと気持ち悪いですが、やりたい事には支障がなさそうなので :-さんの手法を使わせていただこうと思います。
アナログ親父さん共々ありがとうございました。