読者です 読者をやめる 読者になる 読者になる

風柳メモ

ソフトウェア・プログラミング関連の覚書が中心。

32ビット環境だと2GBを超えるファイルサイズが正常に取れないのか…

PHP_INT_MAX = 2147483647 = 0x7FFFFFFF となっている環境だと、

注意: PHP の数値型は符号付整数であり、 多くのプラットフォームでは 32 ビットの整数を取るため、 ファイルシステム関数の中には 2GB より大きなファイルについては期待とは違う値を返すものがあります。

PHP: filesize - Manual

のように、filesize() の返り値が保証されないということを今更ながらに気付く。
64ビット環境でテストしていたから、32ビット環境で動かしてみてしばらく悩んでしまった。

やむを得ず、代用関数を考えて見る

<?php
function    get_filesize($filepath) {
    $filesize = '';
    for (;;) {
        if (!file_exists($filepath)) break;
        exec("/usr/bin/wc -c < {$filepath}", $output, $return_var);
        foreach ($output as $line) if (($filesize = trim($line)) !== '') break;
        break;
    }
    return $filesize;
}   //  end of get_filesize()

"wc -c"の結果を取得して、文字列で返しているだけ。ファイルが存在しない場合等は ""(空文字列) が返る。


BCMathが有効な環境であれば、使えるかな?