file() — ファイル全体を行配列として読み込む

PHP
  • カテゴリ: PHP
  • 掲載バージョン: PHP 8.4
  • 名前空間 / FQCN / コマンド: file(string $filename, int $flags = 0, ?resource $context = null)
  • 関連: file_get_contents / file_put_contents / fopen / SplFileObject / readfile
  • 変更履歴: PHP 8.0 以降、戻り値の型表記が array|false に(挙動自体は従来通り)

要点(TL;DR)

  • 用途:テキストファイルを1行ずつの配列に一括読み込み
  • 最低限:$lines = file('path/to/file.txt');
  • 罠:
    • 大きなファイルでメモリ圧迫(全読み込み)
    • 行末の改行は残るFILE_IGNORE_NEW_LINESで除去)
    • 失敗時はWarning発生+false(例外にはならない)

概要

file() は指定ファイルを読み、各行を要素とする配列を返します。設定ファイルや小さめのログ、テンプレートの行処理など、一括で読み込んで手早く行単位で処理したい場面に向きます。巨大ファイルやストリーム処理には不向きです。

構文 / シグネチャ

array|false file(string $filename, int $flags = 0, ?resource $context = null)

主なフラグ

  • FILE_IGNORE_NEW_LINES:各行末の改行を含めない
  • FILE_SKIP_EMPTY_LINES:空行を配列に含めない
  • FILE_USE_INCLUDE_PATH:include_path 上も探索

引数(表)

引数必須既定値説明
$filenamestringはい対象ファイルパス(URL ラッパ可。allow_url_fopen 必要)
$flagsintいいえ0上記フラグのビット和
$contextresourcenullいいえnull

戻り値array(各要素が1行)/失敗時 false

例外/副作用:失敗時に Warning(例:権限不足、存在しないファイル)。FILE_USE_INCLUDE_PATH 指定時は include_path を探索。全読み込みのためメモリ消費が増える。

使用例

最小例

<?php
// 動作する自己完結例:一旦ファイルを作ってから読み込む
use RuntimeException;

$tmp = __DIR__ . '/example.txt';
file_put_contents($tmp, "apple\nbanana\n\ncherry\n");

$lines = file($tmp, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
if ($lines === false) {
    throw new RuntimeException('読み込み失敗');
}

var_dump($lines); // ["apple", "banana", "cherry"]

実務例:HTTPの設定値を行配列で取得して前処理

<?php
use RuntimeException;

$url = 'https://example.com/config/list.txt';
$ctx = stream_context_create([
    'http' => [
        'timeout' => 2,     // 秒
        'method'  => 'GET',
        'header'  => "User-Agent: my-app\r\n",
    ],
]);

$lines = file($url, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES, $ctx);
if ($lines === false) {
    throw new RuntimeException("取得に失敗:$url");
}

// 前後空白を除去し、コメント行(#)を除外
$items = array_values(array_filter(array_map(
    static fn($s) => trim($s),
    $lines
), static fn($s) => $s !== '' && str_starts_with($s, '#') === false));

// 例:SJIS想定のファイルなら UTF-8 に変換して扱う
$items = array_map(static fn($s) =>
    mb_convert_encoding($s, 'UTF-8', 'SJIS-win,CP932,UTF-8'), $items);

print_r($items);

よくある落とし穴・注意

  • メモリ:全読み込み。巨大ファイルは SplFileObjectfopen+fgets逐次処理を。
  • 改行が残る:デフォルトは行末改行が要素に含まれる。必要に応じて FILE_IGNORE_NEW_LINES
  • 警告と戻り値:失敗時は Warning+false=== false で厳密チェックを。
  • 文字コード:PHPは中身の文字コードを自動認識しない。必要なら mb_convert_encoding
  • URL 読み込みallow_url_fopen=On が必要。タイムアウトはコンテキストで設定。

代替・関連APIとの比較

  • file_get_contents():文字列で全体一括取得。行配列が不要ならこちらが簡潔。
  • fopen + fgets逐次読みで低メモリ・柔軟。大きなファイル、ストリーム処理向き。
  • SplFileObject:OOP で行反復が簡潔。foreach で1行ずつ処理可能。
  • readfile():読み込んで即出力し、読み取りバイト数を返す。配列/文字列が不要なら最速。

選定基準

  • 小さめ&行で欲しい → file()
  • 文字列で一括 → file_get_contents()
  • 大きい/逐次処理 → fopen+fgets or SplFileObject
  • そのまま出力 → readfile()

テスト例(Pest)

<?php
// tests/FileFunctionTest.php
it('reads lines with flags', function () {
    $tmp = sys_get_temp_dir() . '/pest_file_test.txt';
    file_put_contents($tmp, "A\n\nB\n");

    $lines = file($tmp, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    expect($lines)->toBe(['A', 'B']);
});

it('returns false when not found', function () {
    $lines = @file('/no/such/file.txt'); // Warning 回避のため @ だが本番では厳密処理を推奨
    expect($lines)->toBeFalse();
});

トラブルシュート(エラー別)

症状/エラー原因対処
file(): Failed to open stream: No such file or directoryパス誤り絶対パスで検証。__DIR__realpath() を使用
Permission denied読取権限なしファイル/ディレクトリの権限・所有者を確認
HTTP wrapper is disabled などallow_url_fopen=Offphp.ini で有効化、もしくは cURL を利用
実行時にメモリ不足巨大ファイルの全読み込みSplFileObjectfgets に切替
文字化けエンコーディング不一致mb_convert_encoding で UTF-8 に統一

参考リンク

長野県・北アルプス地方在住のフリーランスWebプログラマー。
「落ち着くためのWeb開発」をテーマに、訪れる人が安心して使えるサービスづくりを心がけています。

LaravelやWordPressなどのWebアプリケーション開発を得意とし、技術面の安定性はもちろん、運用後も長く活用できる設計を大切にしています。
静かな山間の暮らしから生まれる視点で、シンプルかつ本質的な解決策をご提案します。

野鳥観察も趣味のひとつで、特にミソサザイ(Wren)に魅力を感じています。
小さな体に反して力強く上向きの尾羽、そして澄んだ鳴き声が遠くまで響く姿に、静かな存在感と芯の強さを感じます。
このサイト名「Laravel Wren」には、そんなミソサザイのように、小さくても確かな価値を届けたいという想いを込めています。

信頼できるパートナーとして、そして気軽に相談できる存在として、あなたのWebプロジェクトをサポートします。

Yudai Tsuyuzakiをフォローする