PHPでのファイルサイズ取得方法を徹底解説(filesize関数)

PHPを使用してファイル操作を行う際、ファイルサイズの取得は非常に重要な基本作業の一つです。Webアプリケーションの開発においては、ファイルのアップロードやダウンロード処理時にファイルサイズを確認することで、データの管理や制限を設定することができます。PHPには、ファイルサイズを簡単に取得するための関数「filesize」が用意されています。本記事では、filesize関数の基本的な使い方から、エラーハンドリング、ユースケースまで幅広く解説し、PHPでのファイルサイズ操作をマスターするための知識を提供します。

目次

filesize関数の概要


filesize関数は、PHPでファイルのサイズをバイト単位で取得するために使用される組み込み関数です。この関数は、指定されたファイルのパスを引数として受け取り、そのファイルのサイズを整数で返します。返される値は、バイト数で表されるため、必要に応じてキロバイトやメガバイトなどに変換することができます。

基本的な構文


filesize関数の基本的な構文は以下の通りです。
“`php
filesize(string $filename): int|false

- **$filename**: サイズを取得したいファイルのパスを文字列で指定します。  
- **戻り値**: 成功した場合はファイルサイズをバイト単位で返し、失敗した場合は`false`を返します。  

filesize関数を使用することで、簡単にファイルのサイズ情報を取得し、さまざまな用途で活用することができます。
<h2>filesize関数の具体例</h2>  
filesize関数を使ってファイルサイズを取得する具体的な方法を、コード例を交えて紹介します。この例では、ローカルにあるテキストファイルのサイズを取得し、その結果を表示します。

<h3>基本的な使用例</h3>  
以下のコードは、`example.txt`というファイルのサイズを取得するシンプルな例です。  

php
<?php
$filename = ‘example.txt’;

// ファイルサイズを取得  
$filesize = filesize($filename);  

if ($filesize !== false) {  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "ファイルサイズを取得できませんでした。";  
}  

?>

この例では、指定されたファイルのサイズを取得し、バイト単位で表示します。もしファイルが存在しない、またはアクセスできない場合、`false`が返され、エラーメッセージが表示されます。

<h3>実行結果の例</h3>  
例えば、`example.txt`のファイルサイズが1024バイトだった場合、出力は次のようになります。  

ファイルサイズ: 1024 バイト

<h3>ファイルが存在しない場合</h3>  
存在しないファイルを指定した場合は、`false`が返されるため、「ファイルサイズを取得できませんでした。」と表示されます。このように、filesize関数の結果をチェックすることで、ファイルの存在やアクセス権を確認することもできます。
<h2>filesize関数のエラーハンドリング</h2>  
filesize関数を使用する際に、エラーハンドリングは重要な要素です。ファイルが存在しない、アクセス権がない、あるいは指定したパスが不正である場合など、ファイルサイズの取得に失敗するケースが考えられます。こうした状況に対して適切な対処を行うことで、プログラムの信頼性を高めることができます。

<h3>基本的なエラーハンドリング方法</h3>  
filesize関数が失敗すると`false`を返します。これを利用して、エラーハンドリングを行うことができます。以下のコード例では、filesize関数の結果が`false`であった場合にエラーメッセージを表示します。  

php
<?php
$filename = ‘example.txt’;

// ファイルサイズを取得  
$filesize = filesize($filename);  

if ($filesize === false) {  
    echo "エラー: ファイルサイズを取得できませんでした。ファイルが存在しないか、アクセス権限がない可能性があります。";  
} else {  
    echo "ファイルサイズ: $filesize バイト";  
}  

?>

この例では、ファイルサイズの取得に失敗した場合に、具体的なエラーメッセージを表示することで、ユーザーや開発者に問題の原因を知らせることができます。

<h3>例外処理を使用したエラーハンドリング</h3>  
PHP では、例外処理を用いてエラーハンドリングをより柔軟に行うことも可能です。以下の例では、`try-catch`構文を使ってエラーハンドリングを行います。  

php
<?php
function getFileSize($filename) {
if (!file_exists($filename)) {
throw new Exception(“ファイルが存在しません: $filename”);
}

    $filesize = filesize($filename);  

    if ($filesize === false) {  
        throw new Exception("ファイルサイズを取得できませんでした: $filename");  
    }  

    return $filesize;  
}  

try {  
    $filename = 'example.txt';  
    $size = getFileSize($filename);  
    echo "ファイルサイズ: $size バイト";  
} catch (Exception $e) {  
    echo "エラー: " . $e->getMessage();  
}  

?>

この例では、ファイルが存在しない場合やファイルサイズの取得に失敗した場合に例外が発生し、その例外をキャッチしてエラーメッセージを表示します。

<h3>エラーハンドリングのベストプラクティス</h3>  
- **ファイルの存在チェック**: `file_exists`関数を使って、filesize関数を呼び出す前にファイルの存在を確認します。  
- **例外処理の活用**: 大規模なシステムや重要なファイル操作では、例外処理を用いることで、より詳細なエラーハンドリングが可能になります。  
- **ユーザーフレンドリーなエラーメッセージ**: 問題が発生した場合に、ユーザーが適切な対応を取れるように、具体的でわかりやすいメッセージを提供します。  

これらのエラーハンドリング手法を取り入れることで、PHPでのファイル操作をより安全に行うことができます。
<h2>ファイルサイズの単位変換方法</h2>  
filesize関数によって取得されたファイルサイズは、バイト単位で返されますが、人間が理解しやすい形式で表示するにはキロバイト(KB)、メガバイト(MB)、ギガバイト(GB)といった大きな単位に変換する必要があります。ここでは、ファイルサイズを自動的に適切な単位に変換する方法を紹介します。

<h3>単位変換の基本ロジック</h3>  
バイトからKB、MB、GBなどの単位に変換するには、1024を基数とする変換を行います。  
- 1 KB = 1024 バイト  
- 1 MB = 1024 KB  
- 1 GB = 1024 MB  

これを応用して、ファイルサイズを適切な単位に変換する関数を作成します。

<h3>PHPコード例: 単位変換関数</h3>  
以下は、ファイルサイズを適切な単位に変換するPHP関数の例です。この関数は、サイズを取得し、最も適した単位で返します。  

php
0 ? floor(log($bytes, 1024)) : 0;
$formattedSize = number_format($bytes / pow(1024, $power), 2);

    return $formattedSize . ' ' . $units[$power];  
}  

// 例として、example.txtのファイルサイズを取得して変換する  
$filename = 'example.txt';  
$filesize = filesize($filename);  

if ($filesize !== false) {  
    echo "ファイルサイズ: " . formatFileSize($filesize);  
} else {  
    echo "ファイルサイズを取得できませんでした。";  
}  

?>

この例では、ファイルサイズを取得した後、`formatFileSize`関数を使ってサイズを自動的に適切な単位に変換し、2桁の小数点まで表示します。

<h3>実行結果の例</h3>  
たとえば、`example.txt`のサイズが1536000バイト(約1.5MB)の場合、出力は次のようになります。  

ファイルサイズ: 1.47 MB

<h3>特定の単位で表示する場合</h3>  
もし特定の単位(例えばMBやGB)で表示したい場合は、変換時に固定の除算を行うように関数を調整します。たとえば、常にMBで表示する場合は以下のようにします。  

php
$sizeInMB = $filesize / 1024 / 1024;
echo “ファイルサイズ: ” . number_format($sizeInMB, 2) . ” MB”;

<h3>単位変換の注意点</h3>  
- **サイズが小さい場合**: 小さなファイルではKB以下の単位で表示する方が適切です。  
- **四捨五入の精度**: 小数点以下の桁数を調整することで、表示の精度を変更できます。  

これらの方法を用いることで、ファイルサイズをユーザーにとってわかりやすく表示することができます。
<h2>大容量ファイルの扱い方</h2>  
PHPで大容量のファイルを扱う際には、特別な注意が必要です。ファイルサイズが非常に大きい場合、filesize関数での取得に制約が生じることがあります。ここでは、大容量ファイルのサイズ取得に関する注意点と解決策について解説します。

<h3>32ビットシステムでの制約</h3>  
32ビットシステムでは、PHPの整数型の最大値が約2GB(2,147,483,647バイト)に制限されているため、それを超えるファイルサイズを正確に取得することができません。この場合、filesize関数は予期しない値を返したり、エラーを引き起こす可能性があります。

<h3>64ビットシステムでの対応</h3>  
64ビットシステムでは、この制約はほぼ解消され、非常に大きなファイルサイズでも正確に取得することが可能です。そのため、サーバーのPHPが64ビットシステムで動作しているかを確認することが重要です。

<h3>大容量ファイルのサイズ取得の代替手法</h3>  
非常に大きなファイルを扱う場合や、システムの制約を回避するために、他の方法を使用することが推奨されます。以下は、ファイルサイズを取得するための代替手法です。

<h4>1. シェルコマンドを使用する</h4>  
`exec`関数を使って、シェルコマンドからファイルサイズを取得する方法です。LinuxやUnix環境では`stat`コマンドを、Windowsでは`dir`コマンドを使うことができます。  

php
<?php
// Linux/Unixの場合
$filename = ‘largefile.txt’;
$filesize = trim(exec(“stat -c%s ” . escapeshellarg($filename)));

if (is_numeric($filesize)) {  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "ファイルサイズを取得できませんでした。";  
}  

?>

この方法では、システムに依存するため、使用する環境に応じたコマンドを設定する必要があります。

<h4>2. PHPのファイルストリームを利用する</h4>  
ファイルストリームを使用してファイルの末尾までシークすることで、ファイルサイズを取得することもできます。  

php
<?php
$filename = ‘largefile.txt’;
$handle = fopen($filename, “rb”);

if ($handle) {  
    fseek($handle, 0, SEEK_END);  
    $filesize = ftell($handle);  
    fclose($handle);  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "ファイルを開くことができませんでした。";  
}  

?>

この方法は、システムに依存せずに大容量ファイルのサイズを取得する手段として有効です。

<h3>ファイルサイズの上限に関する注意点</h3>  
大容量ファイルの操作では、ファイルサイズの上限だけでなく、以下の点にも注意が必要です。  
- **メモリ使用量**: 大きなファイルをメモリに一度に読み込もうとすると、メモリ不足に陥る可能性があります。分割して処理するか、ストリーム処理を使用します。  
- **PHPの設定制限**: `upload_max_filesize`や`post_max_size`といったPHPの設定でファイルサイズの上限が設定されていることがあります。`php.ini`ファイルを確認して適切な設定を行いましょう。  
- **ファイルシステムの制約**: サーバーのファイルシステム自体が扱えるファイルサイズの制約に注意が必要です。  

これらのポイントを押さえることで、大容量ファイルを安全かつ効果的に扱うことができます。
<h2>ファイルの存在確認とfilesize関数</h2>  
filesize関数を使用する前に、対象のファイルが存在するかどうかを確認することが重要です。存在しないファイルを指定すると、filesize関数は`false`を返し、エラーが発生する可能性があります。ファイルの存在確認を行うことで、エラーハンドリングをシンプルにし、コードの信頼性を高めることができます。

<h3>file_exists関数によるファイルの存在確認</h3>  
PHPでは、`file_exists`関数を使って指定したファイルが存在するかどうかを簡単に確認することができます。この関数は、指定されたファイルパスが存在する場合に`true`を返し、存在しない場合は`false`を返します。以下に、`file_exists`関数を用いたコード例を示します。  

php
<?php
$filename = ‘example.txt’;

// ファイルが存在するか確認  
if (file_exists($filename)) {  
    // ファイルサイズを取得  
    $filesize = filesize($filename);  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "ファイルが存在しません: $filename";  
}  

?>

このコードでは、まず`file_exists`関数を使ってファイルの存在をチェックし、存在する場合にのみ`filesize`関数を呼び出しています。存在しない場合は、エラーメッセージが表示されます。

<h3>is_file関数との併用</h3>  
`file_exists`関数は、指定したパスがディレクトリでも`true`を返します。そのため、ファイルであることをさらに確認するために`is_file`関数を併用することが推奨されます。`is_file`関数は、指定されたパスがファイルである場合に`true`を返し、それ以外の場合には`false`を返します。  

php
<?php
$filename = ‘example.txt’;

// ファイルの存在と種類を確認  
if (file_exists($filename) && is_file($filename)) {  
    // ファイルサイズを取得  
    $filesize = filesize($filename);  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "有効なファイルが存在しません: $filename";  
}  

?>

このコードは、ファイルの存在と種類の両方を確認することで、filesize関数の呼び出しが正しい対象に対して行われることを保証します。

<h3>ファイルのアクセス権限の確認</h3>  
ファイルが存在していても、アクセス権限が不足している場合にはfilesize関数でエラーが発生する可能性があります。このような場合には、`is_readable`関数を用いてファイルが読み取り可能かどうかを確認すると良いでしょう。  

php
<?php
$filename = ‘example.txt’;

// ファイルの存在とアクセス権限を確認  
if (file_exists($filename) && is_file($filename) && is_readable($filename)) {  
    // ファイルサイズを取得  
    $filesize = filesize($filename);  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "ファイルが存在しないか、アクセス権限が不足しています: $filename";  
}  

?>

この例では、ファイルが存在し、通常のファイルであり、かつ読み取り可能であることをすべてチェックしています。これにより、filesize関数を安全に使用するための前提条件を満たすことができます。

<h3>ファイル存在確認のベストプラクティス</h3>  
- **複数のチェックを組み合わせる**: ファイルの存在、種類、アクセス権限をすべて確認することで、エラーの発生を最小限に抑えます。  
- **エラーハンドリングを実装する**: 存在しないファイルや権限不足の場合に、適切なエラーメッセージを表示することで、ユーザーや開発者に問題の特定を容易にします。  
- **一貫したファイルパスの管理**: ファイルパスが正しく設定されているかを常に確認し、不正なパスによるエラーを防ぎます。  

これらのポイントを考慮することで、PHPでのファイル操作をより安全かつ効果的に行うことが可能です。
<h2>応用:ディレクトリ内の全ファイルサイズを取得する</h2>  
PHPを使って特定のディレクトリ内にあるすべてのファイルのサイズを合計することで、ディスク使用量の管理やデータ分析に役立てることができます。このセクションでは、ディレクトリ内の全ファイルサイズを取得する方法と、それを実現するコード例を紹介します。

<h3>ディレクトリ内ファイルのサイズ取得方法</h3>  
PHPでは、`scandir`関数を使用して指定したディレクトリ内のファイルとサブディレクトリをリスト化することができます。そのリストを利用して、各ファイルのサイズを取得し、合計するアプローチをとります。サブディレクトリが含まれている場合は再帰的に処理することで、すべてのファイルサイズを取得することが可能です。

<h3>コード例:ディレクトリ内の全ファイルサイズを合計する</h3>  
以下のコードは、指定したディレクトリ内のすべてのファイルサイズを再帰的に合計し、その結果を表示します。  

php
<?php
function getDirectorySize($dir) {
$totalSize = 0;
$files = scandir($dir);

    foreach ($files as $file) {  
        if ($file === '.' || $file === '..') {  
            continue;  
        }  

        $filePath = $dir . DIRECTORY_SEPARATOR . $file;  

        // ファイルであればサイズを追加、ディレクトリであれば再帰的に処理  
        if (is_file($filePath)) {  
            $totalSize += filesize($filePath);  
        } elseif (is_dir($filePath)) {  
            $totalSize += getDirectorySize($filePath);  
        }  
    }  

    return $totalSize;  
}  

$directory = 'example_directory'; // 調査したいディレクトリのパス  
$totalSize = getDirectorySize($directory);  

echo "ディレクトリ '$directory' 内の全ファイルサイズ合計: " . number_format($totalSize) . " バイト";  

?>

このコードでは、`getDirectorySize`関数が指定したディレクトリ内のすべてのファイルとサブディレクトリを再帰的に探索し、ファイルのサイズを合計します。`scandir`関数で取得したファイルリストから、`.`と`..`を除外して処理を行います。

<h3>再帰処理の解説</h3>  
再帰処理を行うことで、サブディレクトリ内のファイルも含めたサイズ合計を計算できます。再帰的に処理する流れは以下の通りです。  
1. ディレクトリ内の各ファイルとサブディレクトリを取得する。  
2. 取得したアイテムがファイルであれば、`filesize`関数でサイズを取得し、合計に加える。  
3. 取得したアイテムがサブディレクトリであれば、そのディレクトリを引数として`getDirectorySize`関数を再帰的に呼び出す。  

<h3>出力例</h3>  
例えば、`example_directory`というディレクトリ内に複数のファイルが存在し、そのサイズ合計が5MBの場合、次のような出力が得られます。  

ディレクトリ ‘example_directory’ 内の全ファイルサイズ合計: 5,242,880 バイト

<h3>考慮すべき点</h3>  
- **アクセス権限のチェック**: ディレクトリやファイルに対してアクセス権限が不足していると、`scandir`や`filesize`が失敗することがあります。必要に応じてエラーハンドリングを実装しましょう。  
- **ディレクトリの大きさに注意**: 非常に大きなディレクトリを再帰的に処理する場合、メモリ使用量が増大する可能性があるため、メモリ制限や実行時間の設定を考慮する必要があります。  
- **隠しファイルの扱い**: 隠しファイルやシステムファイルをサイズ計算に含めるかどうかを検討する必要があります。  

この方法を使うことで、ディレクトリ全体のサイズを把握し、ディスク容量の管理に役立てることができます。
<h2>パーミッションエラーのトラブルシューティング</h2>  
PHPでfilesize関数を使用する際、ファイルのアクセス権限に関連するエラーが発生することがあります。これは、ファイルやディレクトリに対して読み取り権限がない場合に発生しがちです。ここでは、パーミッションエラーが発生する原因と、それを解決する方法について解説します。

<h3>パーミッションエラーの原因</h3>  
パーミッションエラーは、以下の理由により発生することが一般的です。  
1. **ファイルの読み取り権限がない**: ファイルのパーミッションが設定されておらず、PHPスクリプトの実行ユーザーがそのファイルを読み取る権限を持っていない場合。  
2. **ディレクトリのアクセス権が不足している**: ファイル自体が読み取り可能でも、その親ディレクトリにアクセス権がない場合。  
3. **サーバーのセキュリティ設定**: 特定のディレクトリ(例:システムディレクトリやユーザーのホームディレクトリ)へのアクセスがサーバーの設定で制限されている場合。  

<h3>パーミッションエラーを解決する方法</h3>  
パーミッションエラーが発生した場合は、以下の対策を試みることで解決できます。

<h4>1. ファイルとディレクトリの権限を確認する</h4>  
最初に、ファイルやディレクトリの権限を確認します。LinuxやUnixベースのシステムでは、`ls -l`コマンドを使用してパーミッションを確認できます。ファイルの読み取り権限が不足している場合は、`chmod`コマンドで適切な権限を付与します。  

bash

ファイルに読み取り権限を追加する

chmod +r example.txt

ディレクトリに読み取りと実行権限を追加する

chmod +rx example_directory

ファイルが他のユーザー(例:Apacheユーザー)によって読み取られる必要がある場合は、そのユーザーに適切な権限を付与します。

<h4>2. PHPの`is_readable`関数を使用して権限を確認する</h4>  
PHPコード内でファイルの読み取り可能かを確認するために、`is_readable`関数を使用することができます。これにより、ファイルが読み取り可能かどうかを事前にチェックし、エラーメッセージを表示するか処理をスキップすることができます。  

php
<?php
$filename = ‘example.txt’;

// ファイルが読み取り可能か確認  
if (is_readable($filename)) {  
    $filesize = filesize($filename);  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "エラー: ファイルが読み取れません。アクセス権限を確認してください。";  
}  

?>

このコードは、読み取り可能でない場合にエラーメッセージを表示し、アクセス権の問題をユーザーに知らせます。

<h4>3. サーバーの設定を確認する</h4>  
サーバーの設定によっては、特定のディレクトリへのアクセスが禁止されていることがあります。例えば、`open_basedir`設定が有効になっている場合、指定されたディレクトリ以外へのアクセスは許可されません。この場合、`php.ini`ファイルを編集して、アクセスが許可されるディレクトリを設定します。  

ini
; php.ini の設定例
open_basedir = “/var/www/html:/tmp”

この設定によって、指定されたディレクトリのみアクセスが可能となります。

<h3>パーミッションエラーのデバッグ方法</h3>  
- **エラーログの確認**: サーバーのエラーログ(例:Apacheのエラーログ)を確認することで、詳細なエラーメッセージを得ることができます。  
- **ディレクトリごとの権限をチェック**: 対象のファイルだけでなく、その親ディレクトリやさらに上位のディレクトリの権限も確認します。  
- **実行ユーザーを確認する**: PHPスクリプトがどのユーザーで実行されているか(例:`www-data`や`apache`)を確認し、そのユーザーに適切な権限を設定します。  

<h3>セキュリティ上の注意点</h3>  
ファイルやディレクトリのパーミッションを緩めることは、セキュリティリスクを増大させる可能性があります。そのため、最低限必要な権限のみを付与するよう心がけ、他のユーザーやプロセスに対するアクセスを最小限に抑えます。また、アクセス権を変更する際には、どのユーザーにどの権限を付与するかを慎重に検討しましょう。

これらの手法を用いることで、パーミッションエラーの問題を解決し、PHPによるファイル操作を正常に行うことができます。
<h2>他のファイル情報取得関数との違い</h2>  
PHPには、filesize関数以外にもファイル操作や情報取得に関連する関数がいくつか存在します。それぞれの関数は異なる目的で使用され、適切な関数を選択することで効率的なファイル操作が可能になります。このセクションでは、filesize関数と他の代表的なファイル情報取得関数との違いについて解説します。

<h3>file_exists関数との違い</h3>  
`file_exists`関数は、指定したパスにファイルやディレクトリが存在するかを確認するために使用されます。`filesize`関数はファイルのサイズを取得しますが、ファイルが存在しない場合はエラーが発生する可能性があります。そのため、filesize関数を使用する前に`file_exists`関数でファイルの存在を確認するのが一般的です。  

php
<?php
$filename = ‘example.txt’;

if (file_exists($filename)) {  
    $filesize = filesize($filename);  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "ファイルが存在しません。";  
}  

?>

<h3>is_file関数との違い</h3>  
`is_file`関数は、指定されたパスが通常のファイルかどうかを判定します。ディレクトリやシンボリックリンクではなく、実際のファイルであることを確認するために使用されます。`filesize`関数は通常のファイルのサイズを取得するものであり、ディレクトリに対して使用すると予期しない動作が発生することがあるため、`is_file`関数を組み合わせると安全です。  

php
<?php
$filename = ‘example.txt’;

if (is_file($filename)) {  
    $filesize = filesize($filename);  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "指定されたパスは有効なファイルではありません。";  
}  

?>

<h3>is_readable関数との違い</h3>  
`is_readable`関数は、指定されたファイルが読み取り可能かどうかを確認するために使用します。`filesize`関数はファイルのサイズを取得する際にファイルにアクセスするため、読み取り権限がない場合には失敗することがあります。そのため、`is_readable`関数で読み取り権限を事前に確認してから`filesize`を使用するのが望ましいです。  

php
<?php
$filename = ‘example.txt’;

if (is_readable($filename)) {  
    $filesize = filesize($filename);  
    echo "ファイルサイズ: $filesize バイト";  
} else {  
    echo "ファイルが読み取れません。アクセス権限を確認してください。";  
}  

?>

<h3>stat関数との違い</h3>  
`stat`関数は、ファイルに関する多くの情報(サイズ、最終アクセス日時、最終更新日時、権限など)を取得できる強力な関数です。`filesize`関数がファイルのサイズのみを返すのに対して、`stat`関数は配列でさまざまなファイル情報を返します。そのため、ファイルの他の詳細情報も必要な場合には、`stat`関数を使用する方が便利です。  

php
<?php
$filename = ‘example.txt’;
$fileInfo = stat($filename);

if ($fileInfo) {  
    echo "ファイルサイズ: " . $fileInfo['size'] . " バイト";  
    echo "最終更新日時: " . date("Y-m-d H:i:s", $fileInfo['mtime']);  
} else {  
    echo "ファイル情報を取得できませんでした。";  
}  

?>

<h3>filesize関数の使用時の注意点</h3>  
- **存在しないファイルに対するエラー**: 存在しないファイルに対して使用すると、`false`が返されるため、事前に`file_exists`や`is_file`関数で確認することが推奨されます。  
- **読み取り権限の確認**: 読み取り権限がないとエラーが発生する可能性があるため、`is_readable`関数で権限をチェックするのが安全です。  
- **大容量ファイルへの対応**: 特に32ビットシステムでは、大容量ファイル(2GB以上)のサイズ取得に制約があるため、注意が必要です。  

<h3>まとめ</h3>  
PHPの`filesize`関数は、ファイルのサイズを簡単に取得するための便利な関数ですが、他のファイル操作関数と組み合わせて使用することで、より安全かつ柔軟にファイルの情報を取得できます。`file_exists`、`is_file`、`is_readable`、`stat`などの関数と併用することで、さまざまな状況に対応したエラーハンドリングやファイル操作が可能になります。
<h2>実際のユースケース</h2>  
PHPでファイルサイズを取得することは、さまざまな場面で役立ちます。filesize関数を活用することで、ウェブアプリケーションやファイル管理システムの機能を強化することができます。このセクションでは、ファイルサイズ取得が役立つ具体的なユースケースを紹介します。

<h3>1. ファイルアップロードの制限</h3>  
ファイルアップロード機能を提供するウェブアプリケーションでは、アップロードされるファイルのサイズを制限することが重要です。filesize関数を使って、アップロードされたファイルがサーバーの許容範囲内であるかを確認することで、不正なファイルや大容量ファイルのアップロードを防止できます。

php
<?php
$maxSize = 5 * 1024 * 1024; // 5MB
$filename = $_FILES[‘uploaded_file’][‘tmp_name’];

if (file_exists($filename) && filesize($filename) > $maxSize) {  
    echo "エラー: アップロードされたファイルが5MBを超えています。";  
} else {  
    echo "ファイルアップロードが成功しました。";  
}  

?>

<h3>2. ダウンロード時のファイルサイズ表示</h3>  
ユーザーがファイルをダウンロードする際に、ファイルサイズを表示することで、ダウンロードにかかる時間を予測しやすくなります。特に大容量ファイルをダウンロードさせる場合は、ファイルサイズを事前に通知することでユーザーエクスペリエンスを向上させます。

php
<?php
$filename = ‘largefile.zip’;

if (file_exists($filename)) {  
    $filesize = filesize($filename);  
    echo "ダウンロードするファイルサイズ: " . number_format($filesize / 1024 / 1024, 2) . " MB";  
} else {  
    echo "指定されたファイルは存在しません。";  
}  

?>

<h3>3. ディスク容量のモニタリング</h3>  
サーバー上のファイルの総容量を定期的にチェックすることで、ディスク容量の消費状況を監視し、容量が不足する前に対応することが可能です。filesize関数を用いてディレクトリ内のファイルサイズを合計することで、ディスクの使用状況を把握できます。

php
<?php
$directory = ‘/var/www/uploads’;
$totalSize = getDirectorySize($directory);

function getDirectorySize($dir) {  
    $size = 0;  
    foreach (scandir($dir) as $file) {  
        if ($file !== '.' && $file !== '..') {  
            $path = $dir . DIRECTORY_SEPARATOR . $file;  
            $size += is_file($path) ? filesize($path) : getDirectorySize($path);  
        }  
    }  
    return $size;  
}  

echo "現在のディスク使用量: " . number_format($totalSize / 1024 / 1024, 2) . " MB";  

?>

<h3>4. 動画や音声ファイルのストリーミング</h3>  
動画や音声ファイルをストリーミングする場合、ファイルサイズの情報はストリームの開始時に必要です。filesize関数を使ってファイルサイズを取得し、`Content-Length`ヘッダーを設定することで、クライアント側でのストリーミング制御がスムーズに行えます。

php
<?php
$filename = ‘video.mp4’;

if (file_exists($filename)) {  
    $filesize = filesize($filename);  
    header("Content-Type: video/mp4");  
    header("Content-Length: " . $filesize);  
    readfile($filename);  
    exit;  
} else {  
    header("HTTP/1.0 404 Not Found");  
    echo "ファイルが見つかりません。";  
}  

?>

<h3>5. ファイルキャッシュの制御</h3>  
ウェブアプリケーションで静的ファイル(画像やCSSファイルなど)のキャッシュを制御する際、ファイルのサイズや最終更新日時を利用してキャッシュの有効期限を設定することができます。filesize関数でファイルサイズを取得し、必要に応じてキャッシュの制御ヘッダーを設定します。

php
<?php
$filename = ‘style.css’;

if (file_exists($filename)) {  
    $filesize = filesize($filename);  
    $lastModified = filemtime($filename);  
    header("Cache-Control: public, max-age=3600");  
    header("ETag: " . md5($filesize . $lastModified));  
    readfile($filename);  
} else {  
    header("HTTP/1.0 404 Not Found");  
}  

?>
“`

ユースケースのまとめ


filesize関数は、ファイルサイズのチェックや表示だけでなく、アップロード制限やストリーミング制御、ディスク容量の監視など、さまざまな場面で活用できます。これらの具体例を通じて、PHPでのファイル操作が実際にどのように役立つかを理解し、実装に生かすことができます。

まとめ


本記事では、PHPのfilesize関数を使ったファイルサイズの取得方法について詳しく解説しました。filesize関数の基本的な使い方から、エラーハンドリング、単位変換、大容量ファイルの扱い方、そしてディレクトリ内の全ファイルサイズの取得など、さまざまな応用例を紹介しました。また、パーミッションエラーの解決方法や他のファイル情報取得関数との違い、実際のユースケースについても解説し、実務で役立つ知識を提供しました。これらの方法を活用することで、PHPでのファイル操作をより安全かつ効果的に行うことができるでしょう。

コメント

コメントする

目次