- カテゴリ: 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 上も探索
引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
$filename | string | はい | — | 対象ファイルパス(URL ラッパ可。allow_url_fopen 必要) |
$flags | int | いいえ | 0 | 上記フラグのビット和 |
$context | resource | null | いいえ | 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);
よくある落とし穴・注意
- メモリ:全読み込み。巨大ファイルは
SplFileObjectやfopen+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+fgetsorSplFileObject - そのまま出力 →
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=Off | php.ini で有効化、もしくは cURL を利用 |
| 実行時にメモリ不足 | 巨大ファイルの全読み込み | SplFileObject や fgets に切替 |
| 文字化け | エンコーディング不一致 | mb_convert_encoding で UTF-8 に統一 |
参考リンク
- PHP 公式マニュアル:file — ファイル全文を配列に読み込む
https://www.php.net/manual/function.file.php - PHP 公式マニュアル:file_get_contents
https://www.php.net/manual/function.file-get-contents.php - PHP 公式マニュアル:fopen / fgets
https://www.php.net/manual/function.fopen.php
https://www.php.net/manual/function.fgets.php - PHP 公式マニュアル:SplFileObject
https://www.php.net/manual/class.splfileobject.php - PHP 公式マニュアル:コンテキスト(http.wrapper / タイムアウト)
https://www.php.net/manual/context.php

