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.

Другие вопросы по тегам