Чтение и запись в файл с сохранением блокировки - PullRequest
8 голосов
/ 16 марта 2010

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

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

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

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

Ответы [ 3 ]

19 голосов
/ 16 марта 2010

Как уже говорилось, вы можете использовать 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);
3 голосов
/ 16 марта 2010

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

1 голос
/ 23 октября 2011

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

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

    fopen
    flock LOCK_EX
    fread filesize
    rewind
    ftruncate 0
    fwrite 
    flock LOCK_UN
    fclose
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...