PHPでファイルサイズを取得する方法:filesize関数の使い方と活用法

PHPでプログラムがファイルのサイズを確認する際に役立つ関数の一つが、filesize関数です。サーバー上のファイルのサイズを取得し、容量の制限やデータ管理を行うために非常に便利です。特にファイルのアップロード機能やストレージの最適化が必要なアプリケーションにおいて、ファイルサイズを取得することは重要な役割を果たします。本記事では、filesize関数の使い方をはじめ、エラーハンドリングや単位変換、実際の開発での応用例についても詳しく解説していきます。

目次

filesize関数とは


filesize関数は、PHPで指定したファイルのサイズをバイト単位で取得するための関数です。この関数は、主にサーバー上のファイルの容量を確認したり、ファイルサイズ制限を設ける際に利用されます。シンプルな構文で使いやすく、データ処理や容量管理において頻繁に使用される便利な関数です。たとえば、ユーザーがアップロードするファイルのサイズを検証する際や、システムのストレージ状況をモニタリングする際に活用できます。

filesize関数のシンタックスと構文


filesize関数は、ファイルのパスを引数に取り、そのファイルのサイズをバイト数で返します。関数のシンタックスは以下の通りです:

filesize(string $filename): int|false

パラメータ

  • $filename: サイズを取得したいファイルのパスを指定します。相対パスや絶対パスのどちらでも使用可能です。

返り値

  • この関数は、指定したファイルのサイズ(バイト数)を整数で返します。
  • ファイルが存在しない場合や、アクセスできない場合には false を返します。この際、エラーハンドリングを追加することで、意図しないエラーを防ぐことが可能です。

filesize関数を使った簡単な例


filesize関数の基本的な使用例として、特定のファイルのサイズを取得するコードを紹介します。以下のコードは、example.txt というファイルのサイズをバイト単位で取得して表示します。

<?php
$filename = 'example.txt';

if (file_exists($filename)) {
    $size = filesize($filename);
    echo "The file size of $filename is $size bytes.";
} else {
    echo "File does not exist.";
}
?>

コードの解説

  1. $filename に対象ファイルのパスを指定します。
  2. file_exists関数でファイルが存在するかを確認し、存在する場合のみ filesize 関数を実行します。
  3. ファイルサイズが取得できた場合、その値を画面に表示します。

ファイルの存在確認とエラーハンドリング

filesize関数を利用する際、ファイルが存在しない場合やアクセス権がない場合にはfalseが返されます。そのため、エラーハンドリングとファイルの存在確認は重要です。これにより、意図しないエラーやシステム障害を防ぎ、スムーズに処理を進めることができます。

ファイルの存在確認


ファイルが存在するかを確認するために、file_exists関数を併用するのが一般的です。次のコードは、file_existsで存在確認を行い、filesizeの呼び出し前にチェックする例です。

<?php
$filename = 'example.txt';

if (file_exists($filename)) {
    $size = filesize($filename);
    if ($size !== false) {
        echo "The file size of $filename is $size bytes.";
    } else {
        echo "Failed to retrieve file size.";
    }
} else {
    echo "File does not exist.";
}
?>

エラーハンドリング


filesizefalseを返す場合には、ファイルが存在しないか、読み取り権限がない可能性があります。falseが返されたときの処理を追加することで、エラーハンドリングを強化します。

例:ファイル読み取り権限の確認


以下のコードは、ファイルが読み取り可能かどうかも確認し、filesize関数実行前に権限をチェックします。

<?php
$filename = 'example.txt';

if (file_exists($filename) && is_readable($filename)) {
    $size = filesize($filename);
    if ($size !== false) {
        echo "The file size of $filename is $size bytes.";
    } else {
        echo "Failed to retrieve file size.";
    }
} else {
    echo "File does not exist or is not readable.";
}
?>

このように、ファイルの存在と権限を確認し、エラーハンドリングを行うことで、filesize関数をより安全に使用することができます。

ファイルサイズの単位変換の方法

filesize関数はバイト単位でファイルサイズを返しますが、大きなファイルではバイト単位の数値が非常に大きくなり、可読性が低くなります。そこで、キロバイト(KB)、メガバイト(MB)、ギガバイト(GB)といった単位に変換すると分かりやすくなります。

以下のコード例では、ファイルサイズを適切な単位に変換して表示します。

<?php
$filename = 'example.txt';

if (file_exists($filename) && is_readable($filename)) {
    $size = filesize($filename);

    if ($size !== false) {
        if ($size >= 1073741824) {
            $size = number_format($size / 1073741824, 2) . ' GB';
        } elseif ($size >= 1048576) {
            $size = number_format($size / 1048576, 2) . ' MB';
        } elseif ($size >= 1024) {
            $size = number_format($size / 1024, 2) . ' KB';
        } else {
            $size = $size . ' bytes';
        }
        echo "The file size of $filename is $size.";
    } else {
        echo "Failed to retrieve file size.";
    }
} else {
    echo "File does not exist or is not readable.";
}
?>

コードの解説

  1. filesize関数で取得したバイト数をもとに条件分岐を行い、適切な単位に変換します。
  2. 1073741824で割るとGB、1048576で割るとMB、1024で割るとKBに変換できます。
  3. number_format関数を使用して小数点以下2桁まで表示し、可読性を向上させます。

この変換により、ファイルサイズが大きな場合でも人間が読みやすい形でファイルサイズを確認できるようになります。

filesize関数の用途と利点

filesize関数は、ファイルサイズをバイト単位で取得するために設計されており、PHPを使ったファイル管理やデータ容量の制限が必要な場面で活用されます。特に、以下のようなシチュエーションで有効です。

用途

  1. アップロードファイルの制御
    ユーザーがアップロードするファイルのサイズを確認し、指定サイズ以上のファイルを拒否する処理が可能です。これにより、サーバーのストレージを適切に管理でき、過度な容量の消費を防げます。
  2. ストレージ使用量の監視
    サーバー上のファイル容量を定期的に確認し、システムのストレージを最適化するために役立ちます。ディスク容量の使用状況に応じたアラートの設定にも応用できます。
  3. ファイルバックアップの自動化
    ファイルサイズに基づき、バックアップ対象のファイルを絞り込む処理や、サイズに応じて分割してバックアップする際の基準として使用されます。

利点

  • 簡単なシンタックスfilesize関数はシンプルな構文で、特定のファイルのサイズをすぐに取得でき、開発効率が高まります。
  • バイト単位の正確性:サーバーのストレージ管理や容量制限において、正確なバイト単位でサイズが取得できるため、細かい制御が可能です。
  • エラー処理の柔軟性:ファイルが存在しない場合にはfalseを返すため、エラーハンドリングを組み合わせることで信頼性を確保しやすくなります。

filesize関数を活用することで、ファイル管理やストレージ制限が容易になり、サーバーのリソースを効果的に活用できます。

filesize関数を活用した応用例

filesize関数は、シンプルながら多くの実用的な場面で活用できます。ここでは、特に実務に役立つ応用例をいくつか紹介します。

1. アップロードファイルのサイズチェック


ユーザーがファイルをアップロードする際、許可されるサイズを制限するためにfilesize関数を使うことができます。以下の例では、アップロードされたファイルが1MB以下かどうかをチェックします。

<?php
$maxSize = 1048576; // 1MB in bytes
$uploadedFile = 'uploads/userfile.jpg';

if (file_exists($uploadedFile)) {
    $fileSize = filesize($uploadedFile);
    if ($fileSize <= $maxSize) {
        echo "File size is within the allowed limit.";
    } else {
        echo "File size exceeds the 1MB limit.";
    }
} else {
    echo "File does not exist.";
}
?>

2. ディレクトリ内のファイルサイズ合計


あるディレクトリ内に含まれる全ファイルのサイズを集計し、ディレクトリの容量を確認することが可能です。この例では、指定したディレクトリ内のファイルサイズを合計して表示します。

<?php
$directory = 'uploads/';
$totalSize = 0;

if (is_dir($directory)) {
    foreach (scandir($directory) as $file) {
        $filePath = $directory . $file;
        if (is_file($filePath)) {
            $totalSize += filesize($filePath);
        }
    }
    echo "Total size of files in directory: " . number_format($totalSize / 1024, 2) . " KB";
} else {
    echo "Directory does not exist.";
}
?>

3. 動的なファイルサイズ表示のWebページ作成


ファイルダウンロードリンクの横にファイルサイズを表示して、ユーザーがファイルの容量を事前に確認できるようにすることも可能です。この例では、PDFファイルのダウンロードリンクにサイズを表示します。

<?php
$filename = 'files/document.pdf';

if (file_exists($filename)) {
    $size = filesize($filename);
    $displaySize = ($size >= 1048576) ? number_format($size / 1048576, 2) . ' MB' : number_format($size / 1024, 2) . ' KB';
    echo "<a href='$filename'>Download Document ($displaySize)</a>";
} else {
    echo "File not available.";
}
?>

応用例のまとめ


これらの例のように、filesize関数は多様な場面でファイル管理を最適化するために利用でき、特に容量制限やディレクトリの監視、ユーザー向けの情報提供などにおいて役立ちます。これにより、システムの柔軟性やユーザーエクスペリエンスを向上させることができます。

filesize関数の制約と注意点

filesize関数は便利ですが、使用する際にはいくつかの制約と注意点があります。これらを理解することで、想定外のエラーを防ぎ、効率的なコードを書けるようになります。

1. ファイルサイズの制限


filesize関数は、32ビット環境では約2GB(2,147,483,647バイト)を超えるファイルのサイズを正しく取得できないことがあります。このため、2GBを超える大容量ファイルを扱う場合は、64ビット環境で実行するか、filesize以外の方法でサイズを確認する必要があります。

2. キャッシュの影響


一部の環境では、filesizeがファイルサイズの変更をすぐに反映しないことがあります。これは、OSやPHPのファイルキャッシュが影響している場合があります。そのため、頻繁にファイルのサイズをチェックする場合や、変更が行われたファイルに対して即時のサイズ確認が必要な場合には、キャッシュクリアが必要になる可能性があります。

3. ファイルのアクセス権限


filesize関数を使用する際、対象ファイルに読み取り権限がないと、falseを返します。例えば、セキュリティ制限が厳しいサーバー環境では、アクセス権限の不足により正確なファイルサイズが取得できない場合があります。この問題を防ぐためには、事前にis_readableで読み取り可能か確認することが推奨されます。

4. シンボリックリンクの挙動


filesize関数は、シンボリックリンクファイルに対して実際のリンク先ファイルではなく、リンク自体のサイズを返します。リンク先のサイズを取得するためには、リンク先のファイルパスを解決した上でfilesizeを適用する必要があります。

5. ファイルの削除やロック


ファイルが他のプロセスによってロックされている場合や、filesize関数を実行する間にファイルが削除される可能性がある場合も、filesize関数はfalseを返します。高頻度でファイルが更新・削除される環境では、この点にも注意が必要です。

まとめ


これらの制約と注意点を理解し、filesize関数の使用場面に応じた工夫を施すことで、安定したファイル管理が可能になります。

他のPHPファイル関連関数の紹介

filesize関数と組み合わせて使うと便利な、他のPHPファイル関連関数について紹介します。これらを併用することで、ファイル管理や操作がより効率的に行えるようになります。

1. file_exists


file_exists関数は、指定したファイルやディレクトリが存在するかどうかを確認します。filesize関数を使用する前に、ファイルの存在確認を行うために利用されます。

<?php
$filename = 'example.txt';
if (file_exists($filename)) {
    echo "File exists.";
} else {
    echo "File does not exist.";
}
?>

2. is_readable


is_readable関数は、指定したファイルが読み取り可能かどうかを確認します。filesize関数を安全に実行するための権限チェックとして便利です。

<?php
if (is_readable($filename)) {
    echo "File is readable.";
} else {
    echo "File is not readable.";
}
?>

3. is_file


is_file関数は、指定したパスがファイルかどうかを確認します。ディレクトリのチェックには適さないため、特にファイルのみを対象とした操作で役立ちます。

<?php
if (is_file($filename)) {
    echo "This is a file.";
} else {
    echo "This is not a file.";
}
?>

4. file_get_contents


file_get_contents関数は、指定したファイルの内容を文字列として取得します。ファイルサイズの確認後に内容を読み込む際に使え、テキストファイルやJSONファイルの読み取りなどに適しています。

<?php
$content = file_get_contents($filename);
echo $content;
?>

5. unlink


unlink関数は、指定したファイルを削除するために使われます。容量制限を超えるファイルや不要になったファイルを削除する場合に活用できます。

<?php
if (file_exists($filename)) {
    unlink($filename);
    echo "File deleted.";
} else {
    echo "File does not exist.";
}
?>

6. rename


rename関数は、ファイルの名前を変更したり、別のディレクトリに移動するために使用されます。ファイル管理の一環として、整理やリネームが必要なときに便利です。

<?php
$newName = 'new_example.txt';
rename($filename, $newName);
echo "File renamed.";
?>

まとめ


これらのPHPファイル関連関数を活用することで、filesize関数と併用して高度なファイル操作や管理が可能になります。ファイルの存在や権限の確認、内容の取得、削除やリネームなど、多様なファイル操作に対応できるようになります。

演習問題:filesize関数を使ってみよう

ここでは、filesize関数を実際に使ってファイルのサイズを取得し、他のファイル関連関数と組み合わせて使用する演習問題をいくつか用意しました。これらの問題に取り組むことで、PHPにおけるファイル操作の理解が深まります。

問題1:ファイルサイズチェック


ファイル sample.txt のサイズをバイト単位で取得し、サイズが500KB以下であれば「許可」、それ以上であれば「制限オーバー」と表示するプログラムを書いてください。

ヒント: 500KBは500 * 1024バイトです。

問題2:ファイルサイズの単位変換と表示


ファイル example.pdf のサイズを取得し、バイト数をKB、MBに変換して表示するコードを書いてください。サイズが1MB以上の場合は「大容量ファイル」、それ未満の場合は「許可された容量」と出力してください。

問題3:ディレクトリ内ファイルの合計サイズ取得


特定のディレクトリに含まれるすべてのファイルサイズを集計し、合計サイズを表示するプログラムを書いてください。ディレクトリ内のファイル数が10個以上であれば、「ファイル数が多すぎます」と表示するようにしてください。

問題4:ファイルの存在と権限チェック


指定したファイルが存在し、読み取り可能かどうかを確認し、読み取り可能であればサイズを取得して表示するプログラムを書いてください。存在しない場合には「ファイルが見つかりません」、権限がない場合には「アクセス権限がありません」と表示してください。

問題5:アップロードされたファイルのサイズ制限


ユーザーがアップロードしたファイルのサイズをチェックし、1MB以上の場合はアップロードを拒否し、「ファイルサイズが大きすぎます」と表示するコードを書いてください。1MB以下であれば、「アップロードが成功しました」と表示してください。

まとめ


これらの演習問題に取り組むことで、filesize関数と他のファイル関連関数の基本操作が身につきます。実際の開発で役立つ知識を深め、ファイル操作のスキルを向上させましょう。

まとめ

本記事では、PHPのfilesize関数を使用したファイルサイズの取得方法について詳しく解説しました。filesize関数の基本から、エラーハンドリングやサイズ単位の変換、さらに実際の活用例や注意点までを学ぶことで、ファイル管理における理解が深まったかと思います。他のファイル関連関数と組み合わせて使用することで、さらに柔軟で効率的なファイル操作が可能です。filesize関数を活用し、PHPでのファイル管理をスムーズに行えるようにしていきましょう。

コメント

コメントする

目次