第5章 組み込み関数 / 第4回 模擬試験
PHPのファイルロック(`flock()`関数)に関する次の記述のうち、正しいものはどれか。
`flock()`は複数のプロセスが同時に同じファイルを書き換えることによる不整合を防ぐために使われる。
正解
`flock()`はファイルの読み込み速度を高速化するための関数である。
`flock()`はファイルの内容を暗号化する関数である。
`flock()`は必ずファイルを削除する副作用を持つ。
解説
`flock($handle, $operation)`は、ファイルに対して排他ロック(`LOCK_EX`)や共有ロック(`LOCK_SH`)をかける関数です。複数のプロセスが同じファイルへ同時に書き込もうとした際に発生するデータの不整合(片方の書き込みが失われるなど)を防ぐために使われます。
他の選択肢が誤りである理由は次の通りです。
・`flock()`は読み込み速度を高速化する機能ではなく、排他制御(同時アクセス制御)のための機能です。
・`flock()`はファイルの暗号化とは無関係です。暗号化には`openssl_encrypt()`などの別の関数を使います。
・`flock()`はロックを取得するだけの関数で、ファイルを削除する副作用はありません(削除には`unlink()`を使います)。
例:
```
$fp = fopen('counter.txt', 'c+');
if (flock($fp, LOCK_EX)) { // 排他ロックを取得
$count = (int) fread($fp, 1024);
$count++;
ftruncate($fp, 0);
rewind($fp);
fwrite($fp, (string) $count);
flock($fp, LOCK_UN); // ロック解除
}
fclose($fp);
```
(参照: 独習PHP 第4版 第5章 組み込み関数 5.5.5節 ファイルのロック p.242〜243)