PHP アドバンス

PHP ファイルのオープン / 読み込み / クローズ

1. PHP fopen() - ファイルをオープンする

fopen() 関数は、ファイルまたは URL を開くために使用されます。

この関数の第1引数にはオープンする ファイル名(Name) を、第2引数にはどの モード(Mode) でファイルを開くかを指定します。

以下の表は、指定可能な主要なモードをまとめたものです。

モード説明
r読み取り専用(Read only)。ファイルポインタはファイルの先頭から始まります。
r+読み書き用(Read/Write)。ファイルポインタはファイルの先頭から始まります。既存のデータは保持されます。
w書き込み専用(Write only)。ファイルの内容を消去(上書き)します。ファイルが存在しない場合は新規作成します。ファイルポインタはファイルの先頭から始まります。
w+読み書き用(Read/Write)。ファイルの内容を消去します。ファイルが存在しない場合は新規作成します。ファイルポインタはファイルの先頭から始まります。
a追記(Append / 書き込み専用)。既存のデータは保持され、ファイルポインタはファイルの末尾から始まります。ファイルが存在しない場合は新規作成します。
a+追記(Append / 読み書き用)。既存のデータは保持され、ファイルポインタはファイルの末尾から始まります。ファイルが存在しない場合は新規作成します。
x書き込み専用。ファイルを新規作成します。既にファイルが存在する場合は FALSE を返し、エラーを発生させます。
x+読み書き用。ファイルを新規作成します。既にファイルが存在する場合は FALSE を返し、エラーを発生させます。

本レッスンの各例では、以下の内容が記述された "webdictionary.txt" というテキストファイルを使用します。

AJAX = Asynchronous JavaScript and XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language

以下の例は、"webdictionary.txt" を読み取り専用モードでオープンします。もし fopen() がファイルを開けなかった場合には、エラーメッセージを出力して終了します。

実装例:

<?php
// ファイルをオープン、失敗した場合はメッセージを表示して終了
$myfile = fopen("webdictionary.txt", "r") or die("エラー: ファイルを開けませんでした。");

// ファイルの中身を読み込んで出力
echo fread($myfile, filesize("webdictionary.txt"));

// ファイルをクローズ
fclose($myfile);
?>

       ヒント:fread() および fclose() 関数の詳細については後述します。

2. PHP fread() - ファイルを読み込む

fread() 関数は、オープンされたファイルからデータを読み込みます。

第1引数には読み込み対象のファイル(またはファイルポインタを保持する変数)、第2引数には読み込む最大バイト数を指定します。

以下のコードは、"webdictionary.txt" を最後まで読み込みます。

fread($myfile, filesize("webdictionary.txt"));

例えば、最初の 50 バイトだけを読み込みたい場合は以下のように記述します。

fread($myfile, 50);

3. PHP fclose() - ファイルをクローズする

fclose() 関数は、オープンされているファイルをクローズ(終了)します。

       ヒント: すべての処理が終わった後にファイルをクローズすることは、非常に優れたプログラミングプラクティスです。サーバー上でオープンされたままのファイルが残り、不要な リソース(Resources) を消費し続けるのを防ぐためです。

fclose() には、クローズしたいファイル名(またはファイル名を保持する変数)を指定します。

<?php
$myfile = fopen("webdictionary.txt", "r");
// 何らかの処理を実行....
fclose($myfile);
?>

4. PHP fgets() - 一行ずつ読み込む

fgets() 関数は、ファイルから一行(Single Line)だけを読み込みます。

以下の例では、"webdictionary.txt" の最初の1行目を出力します。

実装例:

<?php
$myfile = fopen("webdictionary.txt", "r") or die("ファイルを開けませんでした。");
// 最初の1行を取得して出力
echo fgets($myfile);
fclose($myfile);
?>

       注意:fgets() 関数を呼び出した後、ファイルポインタ(File Pointer) は自動的に次の行の先頭へ移動します。

5. PHP feof() - ファイル終端(End-Of-File)のチェック

feof() 関数は、ファイルポインタが「ファイル終端(EOF)」に達したかどうかをチェックします。

feof() は、データの長さが不明な場合にループ処理を行う際に非常に便利です。以下の例では、ファイル終端に達するまで一行ずつ読み込みを繰り返します。

実装例:

<?php
$myfile = fopen("webdictionary.txt", "r") or die("ファイルを開けませんでした。");

// ファイル終端(EOF)に達するまで1行ずつ出力
while(!feof($myfile)) {
  echo fgets($myfile) . "<br>";
}

fclose($myfile);
?>

6. PHP fgetc() - 一文字ずつ読み込む

fgetc() 関数は、ファイルから一文字(Single Character)だけを読み込みます。

以下の例では、ファイル終端に達するまで一文字ずつ読み込みを行い、出力します。

実装例:

<?php
$myfile = fopen("webdictionary.txt", "r") or die("ファイルを開けませんでした。");

// ファイル終端まで1文字ずつ出力
while(!feof($myfile)) {
  echo fgetc($myfile);
}

fclose($myfile);
?>

       注意:fgetc() 関数を呼び出した後、ファイルポインタは次の文字の位置へ移動します。