Чтение и запись в файл при сохранении замок
Я делаю простой счетчик загрузки страницы, сохраняя текущий счетчик в файле. Вот как я хочу это сделать:
- заблокировать файл (flock)
- прочитайте текущий счет (fread)
- инкрементировать его (++)
- написать новый счетчик (fwrite)
- разблокировать файл/закрыть его (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
Это, прочитайте данные, напишите данные, затем закройте (закрыть автоматически разблокирует).
Да, вы должны использовать перемотку назад перед ftruncate
. В противном случае старое содержимое файла будет заполнено только нулями.
рабочая последовательность:
fopen
flock LOCK_EX
fread filesize
rewind
ftruncate 0
fwrite
flock LOCK_UN
fclose