Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
fopen() / fread() / fwrite() / fclose()対応: PHP 4(2000)
ファイルをストリームとして開き、行単位やバイト単位で読み書きします。大きなファイルの逐次処理やログの追記など、メモリ効率が求められる場面で活用されます。
構文
// ファイルを開いてストリームリソースを返します。 $fp = fopen($filename, $mode); // 指定バイト数を読み込みます。 fread($fp, $length); // 1行を読み込みます。 fgets($fp, $length); // 文字列を書き込みます。 fwrite($fp, $string, $length); // ファイル終端に達したかを判定します。 feof($fp); // ファイルを閉じます。 fclose($fp);
関数一覧
| 関数 | 概要 |
|---|---|
| fopen($filename, $mode) | ファイルを指定されたモードで開きます。成功時はストリームリソースを、失敗時は『false』を返します。 |
| fread($fp, $length) | ストリームから指定バイト数を読み込みます。ファイル終端に達した場合は読み込めた分だけ返します。 |
| fgets($fp, $length) | ストリームから1行を読み込みます。改行文字も含めて返し、ファイル終端では『false』を返します。 |
| fwrite($fp, $string) | ストリームに文字列を書き込みます。書き込んだバイト数を返し、失敗時は『false』を返します。 |
| feof($fp) | ファイルポインタが終端に達している場合に『true』を返します。 |
| fclose($fp) | ストリームリソースを閉じます。成功時は『true』を返します。 |
主なオープンモード
| モード | 概要 |
|---|---|
| "r" | 読み込み専用です。ファイルポインタはファイルの先頭に置かれます。 |
| "w" | 書き込み専用です。ファイルの内容を空にして先頭から書き込みます。ファイルが存在しなければ新規作成します。 |
| "a" | 追記専用です。ファイルの末尾に書き込みます。ファイルが存在しなければ新規作成します。 |
| "r+" | 読み書き両用です。ファイルポインタはファイルの先頭に置かれます。 |
| "w+" | 読み書き両用です。ファイルの内容を空にして先頭から書き込みます。 |
| "a+" | 読み書き両用です。書き込みはファイルの末尾に行われます。 |
サンプルコード
<?php
// ファイルを開いて1行ずつ読み込みます。
$fp = fopen("/var/www/html/data.txt", "r");
if ($fp === false) {
die("ファイルを開けませんでした。");
}
while (!feof($fp)) {
$line = fgets($fp);
if ($line !== false) {
echo $line; // 各行が出力されます。
}
}
fclose($fp);
// fread() で指定バイト数を読み込みます。
$fp = fopen("/var/www/html/data.bin", "r");
$header = fread($fp, 4); // 先頭4バイトを読み込みます。
echo bin2hex($header); // バイナリデータを16進数で出力します。
fclose($fp);
// ファイルに書き込みます。
$fp = fopen("/var/www/html/output.txt", "w");
fwrite($fp, "1行目のデータ\n");
fwrite($fp, "2行目のデータ\n");
fclose($fp);
// ログファイルに追記します。
$fp = fopen("/var/www/html/app.log", "a");
fwrite($fp, date("Y-m-d H:i:s") . " 処理が完了しました。\n");
fclose($fp);
// CSVファイルを1行ずつ処理する実用例
$fp = fopen("/var/www/html/users.csv", "r");
while (($line = fgets($fp)) !== false) {
$columns = explode(",", trim($line));
echo $columns[0] . ": " . $columns[1] . "\n"; // 各行を分割して出力します。
}
fclose($fp);
// 大きなファイルをチャンクごとに読み込む実用例
$fp = fopen("/var/www/html/large_file.dat", "r");
$chunk_size = 8192; // 8KBずつ読み込みます。
while (!feof($fp)) {
$chunk = fread($fp, $chunk_size);
// チャンクごとに処理します。
}
fclose($fp);
概要
『fopen()』を使ったストリーム操作は、ファイル全体を一括で読み込む『file_get_contents()』と異なり、必要な分だけ少しずつ読み書きできます。巨大なファイルを扱う場合、『file_get_contents()』はファイル全体をメモリに展開するため、メモリ不足の原因になります。そのような場合は『fopen()』と『fgets()』で1行ずつ処理するのが適切です。
書き込みモードの『"w"』はファイルの内容を空にしてから書き込むため、既存のデータが失われます。追記したい場合は『"a"』モードを使用してください。開いたファイルは必ず『fclose()』で閉じてください。閉じ忘れるとリソースリークの原因になります。
CSV ファイルの読み込みには専用の『fgetcsv()』関数もあります。ファイル操作のセキュリティについては、ユーザー入力をファイルパスに使用する場合にディレクトリトラバーサル攻撃を防ぐため、『basename()』や『realpath()』で検証してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。