みなさん、こんにちは!
ブリュの公式ブログ.netにお越しいただきまして、ありがとうございます。
このサイトでは、ITについて特化したサイトを運営しています。
ここでは、phpのfopen関数について解説します。
また、fopen関数では、上書きするタイミングが異なります。
その点についても、詳細を解説していきます。
目次
fopen関数の構文
forenは、ファイルをオープンするための関数です。
構文は次のようになります。
1 2 3 4 |
<? php $filepath = "対象ファイルのパス"; $fp = fopen($filepath, "パラメーター"); ?> |
$filepathに対象ファイルのパスを代入します。
fopen関数で、対象ファイルを開いています。
なお。パラメーターは、次のどれかを記述します。
fopen関数のパラメーター
fopen関数のパラメーターには、次のどれかを記述します。
用途に応じて使い分けてください。
パラメーター | 意味 |
r | 読み込み専用でファイルをオープンしています。
書き出しはできません。 |
r+ | 読み込み/書き出しの両方でオープンします。
ファイルが存在しない場合、新規作成は行われません。 |
w | 書き出し専用でファイルをオープンします。
ファイルを開いた時点で、ファイルが空になることに注意! ファイルがない場合には新規作成が行われます。 |
w+ | 書き出し/読み込みでファイルをオープンします。
ファイルを開いた時点で、ファイルが空になることに注意! ファイルがない場合には新規作成が行われます。 |
a | 書き出し専用でファイルをオープンします。
常に追記されます。 |
a+ | 書き出し/読み込みでファイルをオープンします。
常に追記されます。 |
x | 書き込み専用でファイルがオープンされます。
ファイルが存在したらエラーが出ます。 使ったことがないから詳細は知りません。 |
x+ | 書き出し/読み込みでファイルがオープンします。
ファイルが存在したらエラーが出ます。 使ったことはないから詳細は知りません。 |
c | 使ったことはないから詳細は知りません。 |
c+ | 使ったことはないから詳細は知りません。 |
e | 使ったことはないから詳細は知りません。 |
こんな感じですね。
普通はr, r+, w, w+, a, a+ぐらいしか使わないのではないでしょうか?
fwrite関数で書き込む!
fopen関数でオープンしたファイルに書き込む際には、fwrite関数を使います。
1 2 3 4 5 |
<? php $filepath = "対象ファイルのパス"; $fp = fopen($filepath, "パラメーター"); fwrite($fp,"hogehoge"); ?> |
これでオープンしたファイルへの書き込みができます。
fclose関数でファイルを閉じる
fopenでオープンしたファイルは、プログラムが終了するまでにクローズしなければなりません。
ファイルを使い終わったらクローズしましょう。
ファイルのオープンから書き込み、クローズまでの一連の流れは次のコードになります。
1 2 3 4 5 6 |
<? php $filepath = "対象ファイルのパス"; $fp = fopen($filepath, "パラメーター"); fwrite($fp,"hogehoge"); fclose($fp); ?> |
これで、PHPからエラーも出力されなくなります。
上書きしたいときの2パターン
ここで、上書きしたいときの2パターンを紹介します。
ファイルを上書きするのは、既存のデーターを消して新しい情報を書きだすときなのか、古い情報と比較して新しい情報を残すときなのかで、上書きのタイミングが異なります。
既存のデーターを削除して新しいデーターを書き込みしたいとき
これは単純にパラメーターをwまたはw+にすれば大丈夫です。
ファイルをオープンした瞬間に古いデーターは削除されます。
古いデーターと新しいデーターの比較はできません。
新旧のデーターを比較してから書き込みたいとき
新旧のデーターを比較してから書き込みたいときには、とりあえずaまたはa+の追記モードでオープンしていください。
これで、ファイルをオープンした時点では、ファイル内に古いデーターは残っています。
個のデーターを読み込んで新旧のデーターを比較できます。
ただし、ファイルに書き込むときに注意が必要です。
ファイルに書き込むときには、そのままfwriteで書き込むと、単なる追記になってしまいます。
そこで、ファイルをいったん空にする必要があります。
それが次のphpコードです。
1 2 3 4 5 6 7 8 9 10 |
<? php $filepath = "対象ファイルのパス"; $fp = fopen($filepath, "パラメーター"); flock($fp, LOCK_EX); //ファイルをロック ftruncate($fp,0); //ファイルサイズを0にする。 fseek($fp, 0); //ポインタをファイルの先頭に移動 fwrite($fp,$data); //$data内の情報を書きだす flock($fp, LOCK_UN); //ファイルのロック解除 fclose($fp); //ファイルを閉じる。 ?> |
詳細を説明しましょう。
4行目のflock($fp, LOCK_EX);は、ファイルをロックしています。
上書きを行う際に、他のコードからアクセスがあると誤動作が起こるので、一時的に自身以外のアクセスを禁止します。
5行目のftruncate($fp,0);は、ファイルサイズを0にします。
これで、ファイルのデーターはすべて削除されます。
6行目のfseek($fp, 0);は、ポインタをファイルの先頭に移動させます。
これで、ファイルの先頭からデーターの記述が行われます。
6行目がなかったら、謎の空白ができてしまいます。
7行目でようやく書き込みです。
8行目でファイルのロックを解除します。
9行目でファイルを閉じます。
これが、新旧のデーターを比較したいときのファイルオープンと書き込みの方法です。
phpのforenとfwrite関数のまとめ
ここまで、phpのfopenとfwriteについて解説を行いました。
基本的にはfopenの時のパラメーターで挙動を指定できますが、細かい部分の設定は手打ちのプログラミングになってきます。
ただのファイルのオープンと書き出しですが、なかなか奥が深く、はじめてウェブサービスを作成する際の障壁になっている思います。
この記事が、そんな方の役に立てれば幸いです。
以上が、phpのfprenとfwrite関数のまとめでした!