アプリケーション
PHPのファイルの扱い方について理解しましょう。 サーバーはファイルを扱うためにファイルポイントという専用のしおりを使います。 ファイルポインタは現在ファイルをどこまで読んだか、書いたかを示します。 まずファイルを扱う場合、そのファイルをオープンする必要があります。 ファイルをオープンするには以下のようにfopen関数を使う必要があります。 初期状態では、ファイルポインタはファイルの先頭位置に設定できます。
ファイルポインタ = fopen("パスを含めたファイル名", "モード")
ファイルオープン時のモードには以下のようなものです。
モード | 内容 |
---|---|
"r" | 読み取り専用 |
"r+" | 読み取りと書き込み |
"w" | 書き込み専用(ファイルがなければ自動生成) |
"w+" | 書き込みと読み込み(ファイルがなければ自動生成) |
"a" | 追記専用(ファイルがなければ自動生成) |
"a+" | 追記と読み込み(ファイルがなければ自動生成) |
ファイルを開くと、サーバーは自由にその中身を閲覧できます。 ファイルの中身を見て情報を取得するには、行単位で取得するfgetsや文字単位で取得する fgetcを使います。どちらも現在のファイルポインタの位置から読み込みを始めます。
その行の文字列 = fgets(ファイルポインタ [, 読み込みバイト数]) その場所の文字 = fgetc(ファイルポインタ)
また、ファイルを書き込む場合はfputsを使います。fputsは ファイルポインタの場所に、文字列を1行書き込みます。
fputs(ファイルポインタ, "書き込む文字列"[, 書き込みバイト数]);
そして、ファイルの作業が終わるとfclose関数でファイルをクローズしなくてはいけません。
fclose(ファイルポインタ);
それでは今までのファイルの扱い方を参考にして アクセスログを表示するスクリプトを作成しましょう。
<html> <head><title>accesslog.php</title></head> <body> <?php print(date("Y/m/d H:i:s ") . "<br /> \n"); print("<p> access log : </p> \n"); $filepointer=fopen("./log/php-accesslog", "a+"); flock($filepointer, LOCK_EX); fputs($filepointer,date("Y/m/d H:i:s ") . $_SERVER["REMOTE_ADDR"] . "\n"); flock($filepointer, LOCK_UN); rewind($filepointer); while(!feof($filepointer)){ $fileline = fgets($filepointer); print($fileline . "<br />"); } fclose($filepointer); ?> </body> </html>
では、スクリプトの内容を見てみましょう。
$filepointer=fopen("./log/php-accesslog", "a+");
fputs($filepointer,date("Y/m/d H:i:s ") . $_SERVER["REMOTE_ADDR"] . "\n");
fopen関数でlogディレクトリ以下にphp-accesslogというファイルを 追記+読み取りモードでオープンして、fputs関数で日付とIPアドレスを書き込みます。
flock($filepointer, LOCK_EX);
flock($filepointer, LOCK_UN);
flock関数で、誰かが書き込んでいるときに他の人が書き込めないようにファイルをロックします。 LOCK_EXでロックして、LOCK_UNでロックを解除します。 同時書き込みによりデータの破損を防ぐ必要があります。
rewind($filepointer);
while(!feof($filepointer)){ $fileline = fgets($filepointer); print($fileline . "<br />"); }
rewind関数はファイルポインタを最初に戻す関数です。 feof関数はファイルポインタが終端に達したときにTRUEを返します。 ここではwhile文でfeof関数がTRUEじゃない間繰り返し処理を行い 終端に達してTRUEを返したらwhile文を終了します。 while文の中ではfgets関数でファイルから一行づつ読み込んで改行をいれています。
fclose($filepointer);
最後に必ずファイルをクローズします。