ファイル入出力改良版
排他ロックを利用しつつ、どのタイミングでプログラムが強制終了しても、ファイルがクリアされないようにしてみた。
/* ファイルの先頭に追加 */
$fp = fopen('data.txt', 'r+') or exit('error!');
flock($fp, LOCK_EX);
$no = 0;
$data = '';
while ($line = fgets($fp)) {
if (intval($line) > $no) {
$no = intval($line);
}
$data .= $line;
}
$no++;
rewind($fp);
fwrite($fp, "$no\t" . date('H:i:s') . "\n$data");
flock($fp, LOCK_UN);
fclose($fp);
/* ファイルの末尾に追加 */
$fp = fopen('data.txt', 'a+') or exit('error!');
flock($fp, LOCK_EX);
$no = 0;
while ($line = fgets($fp)) {
if (intval($line) > $no) {
$no = intval($line);
}
}
$no++;
fwrite($fp, "$no\t" . date('H:i:s') . "\n");
flock($fp, LOCK_UN);
fclose($fp);
/* 任意の行を編集 */
$fp = fopen('data.txt', 'r+') or exit('error!');
flock($fp, LOCK_EX);
$no = 3; //No.3のデータを編集
$data = '';
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);
/* 任意の行を削除 */
$fp = fopen('data.txt', 'r+') or exit('error!');
flock($fp, LOCK_EX);
$no = 3; //No.3のデータを削除
$data = '';
while ($line = fgets($fp)) {
if (intval($line) != $no) {
$data .= $line;
}
}
rewind($fp);
fwrite($fp, $data);
ftruncate($fp, ftell($fp));
flock($fp, LOCK_UN);
fclose($fp);