Запись в файл. Совсем запутался

Nicca

Новичок
Запись в файл. Совсем запутался

Значит есть голосование. Для каждого учасника такой файл:
Иван // имя
Иванов // фамилия
24 // возвраст
г. Киев // адрес
05-520 // индекс
+480227362402 // телефон
[email protected] // почта
40_1898.jpg // фото
1 // 1- активный учасник, 0 - пасивный
154 // количество голосов

Когда я голосую за этого учасника выполняется такое:
$f=fopen("file.inc", 'a+');
flock($f, LOCK_EX);
$mas=file("file.inc");
ftruncate($f, 0);
$name=$mas[0];
..... Принимаю все данные из масива
$kount=$mas[9];
$kount=$kount+1;
Потом пишу:
fwrite($f, $name);
......
fwrite($f, $kount);
fflush($f);
flock($f, LOCK_UN);
fclose($f);

После этого
$f=fopen("file.inc", 'r');
flock($f, LOCK_EX);
$mas=file("file.inc");
flock($f, LOCK_UN);
fclose($f);
Принимаю из масива фотографию и ее вывожу

Все вроде бы работает нормально но иногда если за человека много раз голосуют то исходный файл "портится" Я его открываю а там например вместо данных одна строчка типа такой:
1111111111111111
Что это? Как такое получается? Где в моем коде ошибка, помогите!
 

rotoZOOM

ACM maniac
Если у тебя файл залочен, то что у тебя возвратит функция fopen ?
 

rotoZOOM

ACM maniac
Ну для чего ты лочишь файл ?

Мне вообще непонятно, после того как ты залочил этот файл, как ты можешь юзать file.
file не работает после залочивания его.
 

Nicca

Новичок
Как для чего? Чтобы в файл мог писать только 1 человек. А все остальные "ждали своей очереди". Ведь что будет если его одновременно откроют 2-3 человека
 

rotoZOOM

ACM maniac
Вот именно, что будет ?
Расскажи ?
Во-первых, ты точно уверен, что file сработает после залочивания ? ru.php.net/file читать комментарии.
Во-вторых, пусть ты уверен в во-первых, тогда на сайт лезут два пользователя.
Для одного файл открылся, залочился и прочитался и записался.
Для второго, он не смог открыться ...
Но ты это не проверяешь !
Ты читаешь из файла file. И опять же не проверяешь, считалось ли что-нить или нет.
 

Nicca

Новичок
1. Коментарии
you can't file("test.txt") when that same file has been flocked. i guess i didn't have a full understanding of what i was doing when i used flock(). all i had to do was move the flock() around, and all was well.
Из этого всего я понял что если файл залочен то применять к нему функцию file нельзя? С инглишем конечно туговато :(

2. Так по-идее для второго - он стоит в очереди и ждет пока первый не закроет файл. Как только первый "отработал свое"
подходит очередь 2-го. Разве не так?

2. Ты предлагаешь так делать:
if($f=fopen(file.inc, 'a+')
{
То что надо делать .....
}
 

rotoZOOM

ACM maniac
1. Да
2. Не нашел в описании функции fopen, что она стоит и ждет, пока файл освободится.
3. Можно наверно попытаться открыть файл в цикле, и установить таймаут, после которого выходить с ошибкой.
 

Nicca

Новичок
1. Но ведь работает file
2. Так это же flock делает!
3. Можешь помочь с кодом. Я уже совсем запутался. Может на примере все пойму?
 

rotoZOOM

ACM maniac
1. точно ?
2. да ?
3.
PHP:
$t=microtime_float();
while (($f=fopen("file.inc","a+"))===false){
     if (microtime_float()-$t>$timelimit){
          // timeout
          break;
     }
}
if ($f===false){
     // произошел таймаут
    return;
}
if (flock($f,LOCK_EX)===false){
    // ошибка залочивания 
    return;
}
// и только тут уже работать с файлом
// причем не file, а например fgets, fscanf и т.д.
fclose ($f);
 
Сверху