ファイル入出力試行錯誤中
色々読んでみて、'r+'
モードは「ファイルの内容が減る可能性がある」という場合には使えないのかと思ったけど、どうやらそうでもないっぽい。
そんな訳で改良版。↓
/* 任意の行を編集 */
$no = 3; //No.3のデータを編集
$data = '';
$fp = fopen('data.txt', 'r+') or exit('error!');
flock($fp, LOCK_EX);
while ($line = fgets($fp)) {
if (intval($line) == $no) {
$data .= "$no\t" . date('H:i:s') . "\n";
} else {
$data .= $line;
}
}
rewind($fp);
fwrite($fp, $data);
ftruncate($fp, ftell($fp));
flock($fp, LOCK_UN);
fclose($fp);
rewind()
とか ftell()
とか ftruncate()
でファイルポインタを操作してやれば、編集によってファイルサイズが減る場合でも対応できるみたい。
これなら素直に排他処理ができるし、どのタイミングでプログラムが強制終了してもデータが吹っ飛ぶことは無いみたいです。
また近々詳しく検証してみるとします。