【PHP】超絶便利関数、file_put_contents()の動作を理解する。

めも。

通常ファイルに値を書き込みたい際は、fopen()でファイルポインタを開き、fwrite()、fclose()、という操作をするが、file_put_contents()はこれを一度にやってくれる。

$filePath = '/path/to/targetFile.ext';
$data = 'testMessage';

// 一気にファイル操作を行ってくれる
file_put_contents($filePath, $data);

上記に示した操作と、下記に示す操作は全く等価の動作を行う。

$filePath = '/path/to/targetFile.ext';
$data = 'testMessage';

// file_put_contents()の内部動作
$fp = fopen($filePath, 'w');
fwrite($fp, $data);
fclose($fp);

またfile_put_contents()は第1引数に指定したファイルが存在しない場合、作成を試み、存在する場合は上書きを行う。これはfopen()関数の「w」モードと同様である。
追記モードでファイル操作を行いたい場合は、第3引数に「FILE_APPEND」を指定することで、fopen()の「a」モードと同様の動作を行う。
第3引数に渡せる定数は以下に示すものが存在し、複数のモードを指定したい場合は「|」(OR演算子)で連結し指定すればよい。

定数 詳細
FILE_APPEND ファイルが存在している場合、上書きではなく追記を行う。
LOCK_EX 書き込み処理中にファイルを排他ロックする。
FILE_USE_INCLUDE_PATH ファイルをインクルードディレクトリから探す。
$filePath = '/path/to/targetFile.ext';
$data = 'testMessage';

// 書き込み中にファイルを排他ロックし、追記モードで動作させる。
file_put_contents($filePath, $data, FILE_APPEND | LOCK_EX);

fopen()を用いてファイル操作を行う際、重複書き込みを防ぐためflock()関数を使用し、ロック→書き込み→ロック開放という手順を踏む必要があったが、file_put_contents()の場合第3引数に「LOCK_EX」を指定するだけで、この操作さえ一気にやってくれてしまう。
それでも「LOCK_SH」や「LOCK_NB」モードを指定したい場合のみ、flock()関数を用いるアプローチを選択する必要があるが、ほとんどの場合file_put_contents()で事足りてしまうと考えられる。