Сделал скрипт, который записывает и сортирует текстовый файл рекордов. Для того, чтобы данные не испортились при одновременном доступе, я его блокирую. Но вот какая штука получается. По ходу выполнения скрипта сам файл приходится открывать несколько раз (с разными вариантами записи и перезаписи) и поэтому сама блокировка получается не эффективной. Подскажите, как перезаписать отсортированные данные в тот же файл, одновременно стерев старые данные. (или как сделать мой скрипт, открывая файл один раз).
Сам скрипт: (производит запись и сортировку таблицы рекордов на 20 игроков)
$date = date("d m Y");
$mes = "$name, $score, $email, $date\\n";
$fa = "record.txt";
$cartFile1 = fopen($fa,"a+");
flock($cartFile1,2);
fputs($cartFile1,$mes);
fclose($cartFile1);
$cartFile = fopen($fa,"a+");
flock($cartFile,2);
while($line = @fgets($cartFile, 1024)) {
$list = f.$i;
$$list = explode(",",($line));
$i++;
}
function cmp_debt($a, $b)
{
if ($a[1]== $b[1]) return 0;
return ($b[1] > $a[1]) ? 1 : -1;
}
$buddy_debts = array($f,$f1,$f2,$f3,$f4,$f5,$f6,$f7,$f8,$f9,$f10,$f11,$f12,$f13,$f14,$f15,$f16,$f17,$f18,$f19,$f20);
usort($buddy_debts, \'cmp_debt\');
foreach ($buddy_debts as $buddy_debt) {
$fileN = $fileN. implode(",", $buddy_debt);
}
$cartFile = fopen($fa,"w+");
flock($cartFile,2);
fputs($cartFile,$fileN);
fclose($cartFile);
$cartFile = @fopen($fa,"r+");
flock($cartFile,2);
while (true) {
$last_addr = $addr;
$addr = ftell($cartFile);
if (!@fgets($cartFile, 1024))
break;
}
ftruncate ($cartFile, $last_addr);
fclose($cartFile);
?>