【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でCSVを読み込む
1<?php 2 3/** 4 * 指定されたCSVファイルをfread関数を使って読み込み、その内容を返します。 5 * この関数は、ファイル全体を一度に読み込むため、非常に大きなファイルには注意が必要です。 6 * 7 * @param string $filePath 読み込むCSVファイルのパス 8 * @return string|false ファイルの内容、または読み込みに失敗した場合はfalse 9 */ 10function readCsvWithFread(string $filePath): string|false 11{ 12 // ファイルを読み込みモードで開きます。 13 // 失敗した場合はfalseを返すため、エラー処理を行います。 14 $handle = fopen($filePath, 'r'); 15 if ($handle === false) { 16 echo "エラー: ファイル '{$filePath}' を開けませんでした。\n"; 17 return false; 18 } 19 20 // ファイルのサイズを取得します。 21 // freadの第2引数にファイルサイズを指定すると、ファイル全体を一度に読み込めます。 22 $fileSize = filesize($filePath); 23 if ($fileSize === false) { 24 echo "エラー: ファイル '{$filePath}' のサイズを取得できませんでした。\n"; 25 fclose($handle); // 開いたファイルを閉じます 26 return false; 27 } 28 29 // ファイル全体を読み込みます。 30 // 読み込みに失敗した場合はfalseを返します。 31 $content = fread($handle, $fileSize); 32 if ($content === false) { 33 echo "エラー: ファイル '{$filePath}' の読み込みに失敗しました。\n"; 34 fclose($handle); // 開いたファイルを閉じます 35 return false; 36 } 37 38 // 開いたファイルを閉じます。 39 fclose($handle); 40 41 return $content; 42} 43 44// --- サンプルコードの実行部分 --- 45 46// 1. 読み込むためのダミーCSVファイルを作成します。 47$csvFilePath = 'sample.csv'; 48$csvContent = <<<CSV 49ID,名前,年齢 501,田中,30 512,山田,25 523,佐藤,35 53CSV; 54file_put_contents($csvFilePath, $csvContent); 55echo "--- サンプルCSVファイル '{$csvFilePath}' を作成しました ---\n\n"; 56 57// 2. 作成したCSVファイルをfread関数で読み込みます。 58echo "--- CSVファイルの内容をfreadで読み込みます ---\n"; 59$csvData = readCsvWithFread($csvFilePath); 60 61if ($csvData !== false) { 62 echo "--- 読み込んだ内容: ---\n"; 63 echo $csvData; 64 echo "\n--- 読み込み完了 ---\n"; 65} else { 66 echo "--- CSVファイルの読み込みに失敗しました。 ---\n"; 67} 68 69// 3. 使用後、作成したサンプルファイルを削除します。 70unlink($csvFilePath); 71echo "\n--- サンプルCSVファイル '{$csvFilePath}' を削除しました ---\n"; 72 73?>
PHPのfread関数は、既に開いているファイルから、指定されたバイト数のデータを読み込む際に利用されます。この関数は、第一引数にfopen関数などで取得したファイルのリソース(ファイル識別子)を、第二引数には読み込みたいバイト数を整数で受け取ります。成功すると読み込んだデータを文字列として返しますが、ファイルの読み込みに失敗した場合はfalseを返します。
提供されたサンプルコードは、CSVファイルの内容をfread関数で読み込む具体的な例を示しています。まず、fopen関数を使って対象のCSVファイルを読み込みモードで開きます。次に、filesize関数でファイルの全体のバイトサイズを取得し、そのサイズをfreadの第二引数に指定することで、ファイル全体を一度に読み込んでいます。データ取得後は、必ずfclose関数で開いたファイルを閉じる必要があります。
コードでは、fopen、filesize、freadといったファイル操作が失敗する可能性を考慮し、それぞれでエラーをチェックして適切な処理を行うエラーハンドリングが実装されています。これにより、ファイルが見つからない、読み取り権限がないなどの問題が発生しても、プログラムが安全に動作するように配慮されています。なお、freadでファイル全体を一度に読み込む方法は、特に巨大なファイルの場合、多くのメモリを消費する可能性があるため注意が必要です。
このサンプルコードでは、fread関数がファイル全体を一括でメモリに読み込むため、非常に大きなファイルを扱う際にはメモリ使用量に注意が必要です。ファイル操作関数(fopen, filesize, fread)は失敗するとfalseを返すため、それぞれの戻り値を必ずチェックし、エラー処理を行うことが重要です。また、fopenで開いたファイルハンドルは、処理が終わったら必ずfcloseで閉じてリソースを解放してください。閉じ忘れるとシステムへの負担となります。CSVファイルを行単位で処理したい場合は、freadよりfgetsやfgetcsv関数が適していることが多いです。
PHP fread によるファイル読み込み例
1<?php 2 3/** 4 * fread 関数の使用例を示す関数。 5 * 6 * この関数は、一時ファイルを作成し、そこに内容を書き込み、 7 * fread を使用してその内容を読み込み、結果を表示します。 8 * 最後に作成したファイルを削除します。 9 */ 10function demonstrateFreadExample(): void 11{ 12 // 一時ファイル名を定義 13 const FILENAME = 'temp_fread_example.txt'; 14 // ファイルに書き込む内容 15 const CONTENT = 'Hello, PHP fread example! This is a test string to demonstrate file reading.'; 16 17 // 1. テストファイルを作成し、内容を書き込む 18 // 'w+' モードは、ファイルを読み書き用に開き、存在しない場合は作成し、 19 // 存在する場合は内容を空にします。 20 $handle = fopen(FILENAME, 'w+'); 21 22 if ($handle === false) { 23 echo "エラー: ファイル '" . FILENAME . "' を開けませんでした。\n"; 24 return; 25 } 26 27 // ファイルに内容を書き込む 28 if (fwrite($handle, CONTENT) === false) { 29 echo "エラー: ファイル '" . FILENAME . "' に書き込めませんでした。\n"; 30 fclose($handle); 31 return; 32 } 33 34 // ファイルポインタを先頭に戻す 35 // fwrite の後に fread が正しく読み込めるようにするため 36 rewind($handle); 37 38 echo "ファイル '" . FILENAME . "' に以下の内容を書き込みました:\n"; 39 echo "'" . CONTENT . "'\n\n"; 40 41 echo "--- fread によるファイル読み込み --- \n"; 42 43 // 2. fread を使用してファイルから内容を読み込む 44 // 読み込むバイト数を指定します。ここでは書き込んだ内容の全バイト数を読み込みます。 45 $bytesToRead = strlen(CONTENT); 46 47 $readData = fread($handle, $bytesToRead); 48 49 if ($readData === false) { 50 echo "エラー: ファイルから読み込めませんでした。\n"; 51 } else { 52 echo "読み込んだ内容 (" . strlen($readData) . " バイト):\n"; 53 echo "'" . $readData . "'\n"; 54 } 55 56 // 3. ファイルを閉じる 57 fclose($handle); 58 59 // 4. 作成した一時ファイルを削除する (クリーンアップ) 60 if (file_exists(FILENAME)) { 61 unlink(FILENAME); 62 echo "\nファイル '" . FILENAME . "' を削除しました。\n"; 63 } 64} 65 66// 関数を実行してサンプルコードの動作を確認 67demonstrateFreadExample(); 68
PHPのfread関数は、開いているファイルから指定されたバイト数のデータを読み込むために使用されます。第一引数$streamにはfopen関数などで開いたファイルのリソース(ファイルハンドル)を、第二引数$lengthには読み込みたいバイト数を整数で指定します。読み込みが成功すると、ファイルポインタが指す位置から読み込んだデータが文字列として返され、失敗した場合はfalseが返されます。
このサンプルコードでは、まずfopen関数を使ってtemp_fread_example.txtという一時ファイルを読み書きモードで作成し、fwrite関数で特定の文字列を書き込んでいます。データを書き込んだ後、ファイルポインタがファイルの終端にあるため、rewind関数を使ってファイルポインタをファイルの先頭に戻します。その後、fread関数を使って、書き込んだ文字列の全バイト数(strlen(CONTENT)で取得)を指定してファイルを読み込みます。読み込んだデータは$readData変数に格納され、その内容とバイト数が表示されます。最後に、fclose関数でファイルを閉じ、unlink関数で作成した一時ファイルを削除して後処理を行っています。これにより、ファイルからデータを読み込む一連の処理を確認できます。
fread関数を使用する際は、まずfopenで開いたファイルリソースを必ずfcloseで閉じましょう。開けない場合や閉じ忘れると、エラーやシステム負荷の原因になります。また、freadや関連するfopen、fwriteなどのファイル操作関数は、失敗するとfalseを返します。必ず戻り値をチェックし、エラー処理を記述してください。
freadはファイルポインタの現在位置からデータを読み込むため、書き込み後に読み込む際や、ファイルの特定箇所から読み込みたい場合はrewindやfseekなどでポインタを先頭に戻す、または適切な位置に移動させる必要がある点も重要です。第2引数で指定する読み込みバイト数は最大値であり、ファイルの終端やストリームの状況によっては、それより少ないバイト数が返されることがある点にもご留意ください。
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'を付けて開くことが推奨されます。