PHP - встречная проблема с использованием функции flock
Я пытаюсь заблокировать файл с помощью функции flock (), чтобы избежать ошибки перезаписи, но счетчик часто сбрасывается (возможно, из-за проблем с чтением).
цифра.txt (счетчик)
4895|533753
frame.php (файл PHP)
$filename="numeri.txt";
$contents=file_get_contents($filename);
if(($fp=@fopen($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".
Как я могу это исправить?
1 ответ
Решение
Если два потока выполнят ваш код почти одновременно с небольшой задержкой, 1-й поток откроет файл для записи и сотрет его содержимое перед блокировкой.
Второй поток прочитает содержимое пустого файла, дождется снятия блокировки, а затем перезапишет правильные данные.
Решение состоит в том, чтобы открыть файл не в режиме "w", а в режиме "a" или "c", а затем использовать fwrite, fseek и ftruncate.