【PHP8.x】fread関数の使い方

fread関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

fread関数は、指定されたファイルポインタから、指定されたバイト数だけデータを読み込むための関数です。この関数は、fopen()関数で開かれたファイルポインタ(ファイルリソース)を受け取り、そのファイルからバイナリセーフな方法でデータを読み込みます。バイナリセーフとは、ファイルの内容をそのまま、どのようなバイト列であっても正しく読み込めることを意味し、テキストファイルだけでなく画像やその他のバイナリファイルに対しても安全に利用できる特徴があります。

第一引数には、ファイルを指し示すファイルポインタ(resource型)を指定します。これは通常、fopen()関数の戻り値です。第二引数には、ファイルから読み込みたい最大バイト数(int型)を指定します。fread関数は、このバイト数に達するか、ファイルの終端(EOF)に到達するか、あるいはパケットの読み込みが完了するかのいずれかの条件が満たされるまで、データを読み込みます。

成功した場合、fread関数は読み込んだデータを文字列として返します。読み込むデータがない場合や、読み込みに失敗した場合は、空の文字列またはfalseが返されることがあります。特に、ファイルの終端に達していないにもかかわらず読み込むべきデータがない場合には空の文字列を返し、ストリームエラーが発生した場合にはfalseを返します。読み込みが完了すると、ファイルポインタは読み込んだデータの分だけ先に進みます。この関数は、ローカルファイルだけでなく、ネットワークストリーム(ソケットなど)からのデータ読み込みにも使用できます。使用後は、fclose()関数でファイルポインタを閉じるのが一般的です。

構文(syntax)

1<?php
2$filePath = 'example.txt';
3$fileHandle = fopen($filePath, 'r');
4if ($fileHandle) {
5    $data = fread($fileHandle, 8192); // ファイルハンドルから最大8192バイトを読み込む
6    fclose($fileHandle);
7    echo $data;
8}
9?>

引数(parameters)

resource $stream, int $length

  • resource $stream: 読み込み対象のファイルポインタまたはストリームリソース
  • int $length: 読み込むバイト数

戻り値(return)

string|false

指定されたファイルポインタから指定されたバイト数だけ読み込んだデータを文字列として返します。読み込みに失敗した場合はfalseを返します。

サンプルコード

PHP fread関数でファイル内容を読み込む

1<?php
2
3/**
4 * fread()関数を使ってファイルの内容を読み込むサンプル関数
5 *
6 * この関数は、一時ファイルを作成し、そのファイルの内容をfread()で読み込んで
7 * 表示した後、ファイルを削除するまでの一連の流れを示します。
8 *
9 * @return void
10 */
11function readFileContentExample(): void
12{
13    // 読み込み対象のファイル名
14    $filename = 'sample_for_fread.txt';
15    // ファイルに書き込むサンプルテキスト
16    $contentToWrite = "Hello, World!\nPHP's fread() function is useful for reading files.";
17
18    // --- 準備: 読み込むためのサンプルファイルを作成 ---
19    // file_put_contents() はファイルの作成と書き込みを一度に行います。
20    // 戻り値が false の場合は失敗です。
21    if (file_put_contents($filename, $contentToWrite) === false) {
22        echo "Error: Failed to create a sample file.\n";
23        return;
24    }
25
26    // --- メイン処理: ファイルのオープン、読み込み、クローズ ---
27    // ファイルポインタ(リソース)を格納する変数を初期化
28    $fileHandle = null;
29    try {
30        // 1. ファイルを読み込み専用モード('r')で開く
31        // fopen() は成功するとファイルリソースを、失敗すると false を返します。
32        $fileHandle = fopen($filename, 'r');
33        if ($fileHandle === false) {
34            echo "Error: Failed to open the file '{$filename}'.\n";
35            return;
36        }
37
38        // 2. ファイルからデータを読み込む
39        // fread(リソース, 読み込む最大バイト数)
40        // filesize() でファイル全体のサイズを取得し、すべてを一度に読み込みます。
41        // 読み込みに成功した場合は文字列、失敗した場合は false を返します。
42        $readContent = fread($fileHandle, filesize($filename));
43
44        if ($readContent !== false) {
45            echo "Successfully read content from the file:\n";
46            echo "----------------------------------------\n";
47            echo $readContent . "\n";
48            echo "----------------------------------------\n";
49        } else {
50            echo "Error: Failed to read from the file.\n";
51        }
52    } finally {
53        // 3. ファイルを閉じる
54        // ファイルハンドルが有効な場合、fclose()でリソースを必ず解放します。
55        // finallyブロックに記述することで、エラー発生時も確実に実行されます。
56        if ($fileHandle) {
57            fclose($fileHandle);
58        }
59    }
60
61    // --- 後処理: 作成したサンプルファイルを削除 ---
62    unlink($filename);
63}
64
65// サンプル関数を実行します
66readFileContentExample();

PHPのfread()関数は、すでに開かれているファイルから指定した長さ(バイト数)のデータを読み込むための基本的な関数です。ファイルの内容を部分的に、あるいは全体的に取得する際に使用されます。

この関数は主に2つの引数を取ります。第1引数には、fopen()関数でファイルを開いた際に得られるファイルポインタ(リソース)を指定します。これは、どのファイルストリームからデータを読み込むかをPHPに伝えるためのものです。第2引数には、読み込むデータの最大バイト数を整数で指定します。

戻り値は、読み込みに成功した場合はその内容が文字列として返されます。一方、ファイルの終端に達した場合や、何らかのエラーで読み込みに失敗した場合はfalseが返されます。

サンプルコードでは、fopen()でファイルを開き、そのリソースをfread()の第1引数に渡しています。第2引数にはfilesize()関数を使ってファイル全体のサイズを指定することで、ファイルの内容をすべて一度に読み込んでいます。読み込んだ文字列は変数に代入され、画面に出力されます。処理が完了した後、fclose()関数でファイルを閉じるのが一連の流れです。エラー発生時でも確実にファイルを閉じるため、finallyブロック内でfclose()を呼び出すことが推奨されます。

fopen関数で開いたファイルは、必ずfclose関数で閉じる必要があります。サンプルコードのようにtry...finally構文を使うと、処理の途中でエラーが発生しても確実にファイルを閉じることができ安全です。fread関数は第2引数で指定したバイト数までしか読み込まないため、ファイル全体を読み込む際はfilesize関数でサイズを取得すると便利です。ただし、巨大なファイルの場合はメモリを大量に消費する点に注意してください。関数の失敗時にはfalseが返るため、空のファイルと区別するために!==演算子で厳密に比較することが重要です。また、画像などのバイナリファイルを扱う際は、fopenのモードに'b'を付けて開くことが推奨されます。

関連コンテンツ