PHP fopen関数とファイル操作
PHP fopen関数とは
PHPではfpoen関数を使うことによって、ファイルまたはURLをオープンすることができます。オープンとは、指定したパスのファイルを開いてアクセスできる状態です。別のファイルの情報を取り込みたいときや、情報を別のファイルに保管しておきたいときなどに使うことができます。fopen関数と他のファイル関数を組み合わせることで、ファイルの内容の書き込みや読み込みをすることも可能です。
fopenの使い方
$変数名(ファイルポインタ) = fopen (“開きたいファイル名”, “オープンモード”);
fopenは第1引数にファイル名、第2引数にオープンモードを選択します。オープンモードではファイルを開く目的が書き込み・読み取り・追記のどれかを指定します。ファイルポインタはアクセスするファイルの目印となるもので、変数に保持して他のファイル関数でファイルを操作する際に渡して使用します。ファイルのオープンに成功した場合はファイルポインタを返し、失敗した場合にはfalseを返します。
<書き込み専用>
モード | 概要 | ファイルポインタの位置 | ファイルがないとき |
---|---|---|---|
w | 書き込みのみでオープン。 | 先頭 | エラー |
x | 読み込みのみでオープン。 | 先頭 | エラー |
c | 書き込みのみでオープン。 | 先頭 | 新規作成 |
a | 追加書き込みのみでオープン。 | 末尾 | 新規作成 |
<読み込み専用>
モード | 概要 | ファイルポインタの位置 | ファイルがないとき |
---|---|---|---|
r | 読み込みのみオープン。 | 先頭 | エラー |
<読み込み+書き込み>
モード | 概要 | ファイルポインタの位置 | ファイルがないとき |
---|---|---|---|
r+ | 読み込み/書き込みでオープン。 | 先頭 | エラー |
w+ | 読み込み/書き込みでオープン。 | 先頭 | 新規作成 |
x+ | 読み込み/書き込みでオープン。 | 先頭 | エラー |
c+ | 読み込み/書き込みでオープン。 | 先頭 | 新規作成 |
a+ | 読み込み/追加書き込みでオープン。 | 末尾 | 新規作成 |
追加で書き込みたいときにはオープンモードを、”a”もしくは”a+”を指定します。
その他ファイル操作の関数
fopen関数はファイルにアクセスできる状態にするだけで、これだけでは読み込むことや書き込む事はできません。ファイルを読み込んだり、書き込んだりするにはその他のファイル関数と組み合わせる必要があります。fopen関数と一緒によく使われる関数をみていきましょう。
fclose 関数
書き方:fclose($fp);
fopenでファイルを開いた後には、 fclose関数を使用してファイルを閉じる必要があります。引数にはfopen関数のファイルポインタを指定します。成功した場合にはtrue、失敗した場合にはfalseを返します。
fgets 関数
書き方:$count = fgets($fp, "文字列の長さ");
開いたファイルを1行ずつ読み込むにはfgets関数を使用します。第1引数にはfopen関数のファイルポインタ、第2引数には文字列の長さを指定します。
fwrite 関数
書き方:fwrite($fp, “書き込む文字列”);
ファイルに書き込みをするときにはfwrite関数を使用します。第1引数にはファイルポインタを指定し、第2引数には書き込む文字列を指定します。
※開いたファイルにABCDと書き込み。このときオープンモードが書き込みであれば上書きされ、”a”または”a+”であれば追記される。
flock 関数
書き方:flock($fp, “ロックモード”);
複数のプロセスからアクセスがある場合は、flock関数を使って他からファイルが変更されるのを防ぎます。第1引数にはロックするファイルポインタを指定し、第2引数にはロックモードを指定します。
ロックモード | 説明 |
---|---|
LOCK_SH | 共有ロック。ほかのプロセスの読み取りは可、書き込みは不可。 |
LOCK_EX | 排他的ロック。読み取り/書き込みともに不可。 |
LOCK_UN | ロック解除。 |
LOCK_NB | ロック中にflock()でブロックさせない。 |
rewind 関数
書き方:rewind($fp);
rewind関数を使うことによってファイルポインタの位置を先頭に移動することができます。引数にはファイルポインタを指定します。ファイルポインタの移動に成功した場合にはtrue、失敗した場合にはfalseを返します。
fopen関数とその他ファイル関数の使い方
fopen関数とその他のファイル関数を使った、簡単なアクセスカウンターをご紹介します。アクセスカウンターは何回アクセスがあったのかを数えるプログラムです。今回はsample.php と数字だけを保管するcount.txtのテキストファイルを用意します。
※count.txtには0を入れておきます。
<sample.php>
$counter_file = 'count.txt'; // count.txtというカウント数を書き込むテキストファイル
$counter_lenght = 8; // 文字列の長さは8文字まで(指定しなくても良い)
$fp = fopen($counter_file, 'r+'); // count.txtファイルを開く
if ($fp){ // ファイルオープンが成功したらtrue
if (flock($fp, LOCK_EX)){ // ファイルのロックに成功したらtrue
$counter = fgets($fp, $counter_lenght); // count.txtに書かれたカウント数を読み込む
$counter++; // counter.txtに書かれた数にプラス1
rewind($fp); // ポインタを先頭に戻す
if (fwrite($fp, $counter) === FALSE){
print('ファイル書き込みに失敗しました');
}
flock($fp, LOCK_UN); // ロック解除
}
}
fclose($fp); //ファイルを閉じる
sample.phpにアクセスするたびにcounter.txtに1ずつプラスされ、sample.php に何回アクセスがあったのかを記録します。fopen関数でファイルを開いてアクセスできる状態にし、fgets関数でファイルの情報を読み込みます。fwrite関数で書き込みが完了したら、fclose関数でファイルを閉じます。flock関数はなくても動作しますが、アクセスカウンターでは他の人が同時にそのファイルに変更を加える可能性を考慮して入れておきます。
<まとめ
いかがだったでしょうか。PHPのfopen関数やその他ファイル操作について理解を深めていただけたら幸いです。オープンモードやロックモード、ポインタの位置など指定するモードによって細かい違いがあります。この機会にもう一度確認してみてはいかがでしょうか。