バイナリセーフなファイルの読み込み

# fread

(PHP 4, PHP 5, PHP 7, PHP 8)

fread — バイナリセーフなファイルの読み込み

### 説明

function fread(resource `$stream`, int `$length`): string|false

fread() は、`stream` が指すファイルポインタから最高 `length` バイト読み込みます。 以下のいずれかの条件を満たしたら、読み込みを終了します。

- `length` バイトぶん読み込んだ
- EOF (ファイルの終端) に達した
- パケットが利用可能になるか、あるいは ソケットのタイムアウト が発生した (ネットワークストリームの場合)
- バッファつきで読み込まれた、プレーンなファイルでないストリームの場合に、 一回の読み込みバイト数がチャンクサイズ (通常は 8192) に達した。 それまでにバッファされていたデータの内容によって、返されるデータのサイズはチャンクサイズより大きくなることがあります。

### パラメータ

`stream`
  fopen() を使用して作成したファイルシステムポインタリソース。
`length`

  最大 `length` バイトまで読み込む。

### 戻り値

読み込んだ文字列を返します。失敗した場合に `false` を返します。

### 例

例1 シンプルな fread() の例

    <?php
    // ファイルの中身を読んで文字列に格納する
    $filename = "/usr/local/something.txt";
    $handle = fopen($filename, "r");
    $contents = fread($handle, filesize($filename));
    fclose($handle);
    ?>

例2 バイナリの fread() の例

警告

バイナリとテキストファイルの形式が異なるシステム(すなわち Windows)では、fopen()の mode パラメータに 'b' を指定してファイルをオープンする必要があります。

    <?php
    $filename = "c:\\files\\somepic.gif";
    $handle = fopen($filename, "rb");
    $contents = fread($handle, filesize($filename));
    fclose($handle);
    ?>

例3 リモートファイルの fread() の例

警告

通常のローカルファイル以外のもの、例えば リモートファイル や popen()、fsockopen() が返す ストリームを読み込んでいる場合には、 パケットが有効になった後に読み込みはストップします。 つまり以下の例のように分割されたデータを結合すべきであるということです。

    <?php
    $handle = fopen("http://www.example.com/", "rb");
    $contents = stream_get_contents($handle);
    fclose($handle);
    ?>

    <?php
    $handle = fopen("http://www.example.com/", "rb");
    if (FALSE === $handle) {
        exit("Failed to open stream to URL");
    }

    $contents = '';

    while (!feof($handle)) {
        $contents .= fread($handle, 8192);
    }
    fclose($handle);
    ?>

### 注意

> 注意:

> ファイルの中身を文字列に格納したいだけならば、file_get_contents() を使うほうが上記の例よりも効率的です。

> 注意:

> fread() は、 ファイルポインタが現在指している位置から読み込みを開始することに注意しましょう。 ポインタの現在位置を調べるには ftell() を、 そしてポインタの位置を巻き戻すには rewind() を使用します。

### 参考

- fwrite() - バイナリセーフなファイル書き込み処理
- fopen() - ファイルまたは URL をオープンする
- fsockopen() - インターネット接続もしくは Unix ドメインソケット接続をオープンする
- popen() - プロセスへのファイルポインタをオープンする
- fgets() - ファイルポインタから 1 行取得する
- fgetss() - ファイルポインタから 1 行取り出し、HTML タグを取り除く
- fscanf() - フォーマットに基づきファイルからの入力を処理する
- file() - ファイル全体を読み込んで配列に格納する
- fpassthru() - ファイルポインタ上に残っているすべてのデータを出力する
- fseek() - ファイルポインタを移動する
- ftell() - ファイルの読み書き用ポインタの現在位置を返す
- rewind() - ファイルポインタの位置を先頭に戻す
- unpack() - バイナリ文字列からデータを切り出す

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open