PHP - BASIC - 11. PHPのファイルシステムを扱う関数 - 6. ファイルの読み込み

これまでに file_get_contents 関数や file 関数によるファイルの読み込みについて学習してきました。ファイルの内容を1つの文字列データとして読み込むのであれば file_get_contents 関数、行単位で配列に変換したいのであれば file 関数を使うことができます。これらの関数は手軽に使えて便利ですが、ファイルサイズが大きい場合はその分メモリを消費してしまうことになるので注意が必要です。

プログラムの実行環境に依存しますが、ファイルサイズが数KB程度であれば file_get_contents 関数や file 関数を使っても問題ないでしょう。

読み込むファイルサイズが大きい場合や、ファイルの入出力処理を細かく制御したい場合は fopen 関数や fgets 関数、 fclose 関数などを組み合わせて制御します。ここでは以下の関数を組み合わせてファイルを制御するプログラムを取り上げます。

  • fopen - ファイルまたは URL をオープンする
  • fgets - ファイルポインタから 1 行取得す
  • fclose - オープンされたファイルポインタをクローズする

それでは次のプログラム( fs5.php )を作成してみましょう。

<?php
$file = "hello.txt"; 
$handle = fopen($file, "r"); 
$line = fgets($handle); 
echo $line; 
fclose($handle); 

またここではカレントディレクトリに次のような hello.txt ファイルが存在するものとします。

Hello PHP
Hello Programming

まずはターミナルからプログラムを実行してみましょう。

$ php fs5.php
Hello PHP

実行結果から hello.txt ファイルの1行目の内容が出力されているのがわかります。

それではプログラムの詳細を見てみましょう。ファイルの読み込みを行うには、始めに fopen 関数を使います。

$file = "hello.txt"
$handle = fopen($file, "r"); 

fopen 関数は第1引数に対象となるファイル名、第2引数にアクセス形式を指定します。第2引数のアクセス形式に指定する主要なものは以下のとおりです。

  • “r”
    • 読み込みモード
  • “w”
    • 書き込みモード(上書き)
  • “a”
    • 書き込みモード(追記)

ここでは fopen 関数の第2引数のアクセス形式に "r" を指定しているので、読み込みモードでファイルを開いています。

また fopen 関数は戻り値として、ファイルポインタを返却します。ファイルポインタとはファイルとの接続を表すものです。これまでのように文字列や数値のようなデータではありませんが、後の fgets 関数や fclose 関数の引数として利用します。このようにファイルポインタを利用することでファイルとやりとりできます。

ファイルポインタはファイルポインタリソースと呼ぶこともあります。

次に fgets 関数を呼び出しています。

$line = fgets($handle); 
echo $line; 

fgets 関数は引数で受け取ったファイルポインタからデータを1行読み取り、戻り値として返却します。

fgets 関数と類似した関数に fgetc 関数もあります。 fgetc 関数はファイルポインタから1文字を取り出すための関数です。

最後に fclose 関数を呼び出しています。

fclose($handle); 

fclose 関数は、ファイルを閉じるための関数です。 fclose 関数は引数にファイルポインタ受け取ります。コンピュータ上で開けるファイルの数には上限があるので作業を終えたファイルは閉じておく必要があります。

PHPプログラムはプログラムの終了時に、プログラム内で開いていたファイルを自動的に閉じるようになっています。

while文とfgets関数

さきほどのプログラム( fs5.php )は以下のように while 文を使うように修正することで、ファイル内のすべての内容を出力できます。

<?php
$file = "hello.txt"; 
$handle = fopen($file, "r"); 
$line = fgets($handle);
while($line !== false) {
  echo $line; 
  $line = fgets($handle);
}
fclose($handle); 

fgets 関数はファイルから1行ずつデータを読み込み、戻り値として返却します。 fgets 関数を繰り返し呼ぶことでファイルの行を先頭行から順に処理していくことができます。また fgets 関数はファイルの終端に達しているときに呼び出すと戻り値に false を返します。

また、さきほどのプログラム( fs5.php )は次のように書き換えることもできます。

<?php
$file = "hello.txt";
$handle = fopen($file, "r");
while(($line = fgets($handle)) !== false) {
  echo $line;
}
fclose($handle);

上記のプログラムでは while 文の条件の中で ($line = fgets($handle)) とすることでファイルポインタから1行のデータを読み込みます。ファイルの終端に達している場合は fgets 関数の戻り地に false が返却されるのでこのように実装することもできます。

それではプログラムを実行してみましょう。

$ php fs5.php
Hello PHP
Hello Programming

実行結果からファイルの内容を全て出力できているのがわかります。

まとめ

  • fopen 関数は戻り値にファイルポインタを返す
  • fgets 関数はファイルポインタからデータを読み込む
  • fclose 関数でファイルポインタを破棄する

fopen - ファイルまたはURLをオープンする

  • 引数
    1. ファイル名
    2. アクセス形式
      • “r”
      • 読み込みモード
      • “w”
      • 書き込みモード(上書き)
      • “a”
      • 書き込みモード(追記)
  • 戻り値
    • ファイルポインタ
    • オープンに失敗した場合は false

fgets - ファイルポインタから1行取得する

  • 引数
    1. ファイルポインタ
    2. 読み込みデータ長 (省略可能)
      • 省略時は行末まで読み込む
  • 戻り値
    • 文字列(1行のデータ)
    • 読み込むデータがない場合は false
    • 読み込みに失敗した場合は false

fclose - オープンされたファイルポインタをクローズする

  • 引数
    • ファイルポインタ
  • 戻り値
    • 成功した場合は true 、失敗した場合は false