PHP SCHOOL.biz

PHPの学習をする為のブログです。プログラム未経験の方にも理解できるよう基本的な、PHPの知識について身に付けることができるようにわかりやすい内容にしていきたいと思っています。


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

この章では、サーバー上のファイルを開いたり、読み込んだり閉じたりする方法について説明します。

PHPでのファイルの開き方

ファイルを開くより良い方法は、fopen()関数を使うことです。この関数は、readfile()関数よりも多くのオプションを提供します。
レッスンでは、前回の賞で使用したテキストファイル "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

fopen()の最初のパラメータには開くファイルの名前が書き、2番目のパラメータにはファイルを開くモードを指定します。次の例では、fopen()関数が指定されたファイルを開くことができない場合にもメッセージを生成します。

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fread($myfile,filesize("webdictionary.txt"));
fclose($myfile);
?>

実行結果

ヒント:fread()関数とfclose()関数について以下に説明します。
ファイルは次のいずれかのモードで開くことができます。

mode 説明
r 読み込みのみでオープンします。ファイルポインタをファイルの先頭に置きます。
r+ 読み込み/書き出し用にオープンします。 ファイルポインタをファイルの先頭に置きます。
w 書き出しのみでオープンします。ファイルポインタをファイルの先頭に置き、 ファイルサイズをゼロにします。ファイルが存在しない場合には、 作成を試みます。
w+ 読み込み/書き出し用でオープンします。 ファイルポインタをファイルの先頭に置き、 ファイルサイズをゼロにします。 ファイルが存在しない場合には、作成を試みます。
a 書き出し用のみでオープンします。ファイルポインタをファイルの終端に置きます。 ファイルが存在しない場合には、作成を試みます。 このモードは、fseek() では何の効果もありません。 書き込みは、常に追記となります。
a+ 読み込み/書き出し用でオープンします。 ファイルポインタをファイルの終端に置きます。 ファイルが存在しない場合には、作成を試みます。 このモードは、fseek() では読み込み位置のみに影響します。 書き込みは、常に追記となります。
x 書き込みのみでオープンします。ファイルポインタをファイルの先頭に置きます。 ファイルが既に存在する場合には fopen() は失敗し、 E_WARNING レベルのエラーを発行します。 ファイルが存在しない場合には新規作成を試みます。 これは open(2) システムコールにおける O_EXCL|O_CREAT フラグの指定と等価です。 このオプションはPHP4.3.2以降でサポートされ、また、 ローカルファイルに対してのみ有効です。
x+ 読み込み/書き出し用でオープンします。 それ以外のふるまいは 'x' と同じです。
c 書き込みのみでオープンします。ファイルが存在しない場合には新規作成を試みます。 ファイルが既に存在する場合でもそれを ('w' のように) 切り詰めたりせず、 また ('x' のように) 関数のコールが失敗することもありません。 ファイルポインタをファイルの先頭に置きます。これは、アドバイザリ・ロック (flock() を参照ください) を確保してからファイルを変更したい場合に便利です。 'w' を使うと、ロックを取得する前にファイルを切り詰めてしまいます (もしファイルを切り詰めたいのなら、ロックを要求した後で ftruncate() を使うこともできます)。
c+ 読み込み/書き出し用でオープンします。 それ以外のふるまいは 'c' と同じです。
e 開いているファイル記述子にclose-on-execフラグを設定します。 POSIX.1-2008でコンパイルされたPHPでのみ利用可能です。

PHPでのファイルのリード - fread()

fread()関数は、開いているファイルから読み込みます。
fread()の最初のパラメータは読み込むファイルの名前を含み、2番目のパラメータは読み込む最大バイト数を指定します。
次のPHPコードは "webdictionary.txt"ファイルを最後まで読み込みます。

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

PHPでのファイルのクローズ - fclose()

fclose()関数は、開いているファイルを閉じるために使用されます。
すべてのファイル処理を終了した後は、すべてのファイルを閉じることをお勧めします。サーバー上で開いているファイルを実行してリソースを消費してしまいます。
fclose()には、閉じたいファイル名(またはファイル名を保持する変数)が必要です。

<?php
$myfile = fopen("webdictionary.txt", "r");
// some code to be executed....
fclose($myfile);
?>

PHPの単一行読み込み - fgets()

fgets()関数は、ファイルから1行を読み込むために使用されます。
次の例は、 "webdictionary.txt"ファイルの最初の行を出力します。

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
echo fgets($myfile);
fclose($myfile);
?>

実行結果

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

PHPのエンドファイルチェック - feof()

feof()関数は、 "ファイルの終わり"(EOF)に達したかどうかをチェックします。
feof()関数は、未知の長さのファイルデータをループするのに便利です。
以下の例は、ファイルの終わりに達するまで、行ごとに "webdictionary.txt"ファイルを読み込みます。

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// Output one line until end-of-file
while(!feof($myfile)) {
  echo fgets($myfile) . "<br>";
}
fclose($myfile);
?>

実行結果

PHPの単一文字読み込み - fgetc()

fgetc()関数は、ファイルから単一の文字を読み取るために使用されます。
以下の例では、ファイルの終わりに達するまで、 "webdictionary.txt"ファイルを文字単位で読み取ります。

<?php
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// Output one character until end-of-file
while(!feof($myfile)) {
  echo fgetc($myfile);
}
fclose($myfile);
?>

実行結果

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