Чтение и запись в файл при сохранении замок

Я делаю простой счетчик загрузки страницы, сохраняя текущий счетчик в файле. Вот как я хочу это сделать:

  1. заблокировать файл (flock)
  2. прочитайте текущий счет (fread)
  3. инкрементировать его (++)
  4. написать новый счетчик (fwrite)
  5. разблокировать файл/закрыть его (flock/fclose)

можно ли это сделать без потери замка?

Как я понимаю, файл не может быть записан, чтобы не потерять замок. Единственный способ, который я придумал для решения этой проблемы, - написать символ, используя режим "r+", а затем подсчитать символы.

3 ответов


как сказано, Вы можете использовать FLock. Простой пример:

//Open the File Stream
$handle = fopen("file.txt","r+");

//Lock File, error if unable to lock
if(flock($handle, LOCK_EX)) {
    $count = fread($handle, filesize("file.txt"));    //Get Current Hit Count
    $count = $count + 1;    //Increment Hit Count by 1
    ftruncate($handle, 0);    //Truncate the file to 0
    rewind($handle);           //Set write pointer to beginning of file
    fwrite($handle, $count);    //Write the new Hit Count
    flock($handle, LOCK_UN);    //Unlock File
} else {
    echo "Could not Lock File!";
}

//Close Stream
fclose($handle);

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

http://php.net/flock


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

рабочая последовательность:

    fopen
    flock LOCK_EX
    fread filesize
    rewind
    ftruncate 0
    fwrite 
    flock LOCK_UN
    fclose