2013-04-12 2 views
1

Я пытаюсь заблокировать файл, используя функцию flock(), чтобы избежать ошибки перезаписи, но счетчик часто сбрасывается (возможно, для проблемы с чтением).PHP - проблема счетчика с использованием функции flock

numeri.txt (счетчик)

4895|533753 

frame.php (PHP файл)

$filename="numeri.txt"; 
$contents=file_get_contents($filename); 
if(([email protected]($filename,'w'))!==false) 
{ 
    if(flock($fp,LOCK_EX)) 
    { 
     $contents=explode("|",$contents); 
     $clicks=$contents[0]; 
     $impressions=$contents[1]+1; 
     fwrite($fp,$clicks."|".$impressions); 
     flock($fp,LOCK_UN); 
    } 
    fclose($fp); 
} 

Иногда счетчик возвращается "| 1" вместо "4895 | 533754".

Как это исправить?

+0

Возможно, вы запускаете скрипт frame.php дважды с небольшой задержкой? – zavg

+0

Это счетчик, скрипт работает более 60 раз в минуту. Я использовал функцию стада, чтобы избежать проблем, но она все еще не работает. – Megadv

ответ

2

Если два потока будут выполнять ваш код почти одновременно с небольшой задержкой, первый поток откроет файл для записи и удалит его содержимое перед блокировкой.

2-й поток прочитает содержимое пустого файла, дождитесь блокировки и затем перепишет правильные данные.

Решение состоит в том, чтобы открыть файл не в «w», а в режиме «a» или «c», а затем использовать fwrite, fseek и ftruncate.

+0

Я сделал это перед вашим ответом, и теперь он отлично работает. Но почему я должен использовать fseek? – Megadv

+1

В вашем случае это не обязательно, это просто замечание общего дела. – zavg

Смежные вопросы